2019-04-22 15:12:36 zaishuiyifangxym 阅读数 2748
  • C++ 百万并发网络通信引擎架构与实现 (Socket、全栈...

    本课程由刘远东、张立铜两位工程师将两人在企业多年积累的开发经验结合而成。从基础的网络知识开始由浅入深地讲解如何使用C++实现一套支持百万级别并发的网络通信引擎。包含:高频并发、多线程、多进程、线程池、内存池、软件硬件瓶颈、如何测试优化网络处理能力等技术知识。可以应用在Windows、Linux、Android、IOS系统上。对从事高性能网络处理的前后端开发人员有极大帮助。咨询群:648738912

    13059 人正在学习 去看看 张立铜

目录

1 为什么图像边缘是图像高频分量呢?

2 图像傅立叶变换的物理意义

参考资料


 

1 为什么图像边缘是图像高频分量呢?

网上有一个解释非常形象:将傅里叶变换比作一个玻璃棱镜。棱镜是可以将光分解为不同颜色的物理仪器,每个成分的颜色由波长(或频率)来决定。

傅里叶变换可以看作是数学上的棱镜,将函数基于频率分解为不同的成分。当我们考虑光时,讨论它的光谱或频率谱。同样, 傅立叶变换使我们能通过频率成分来分析一个函数。

 

2 图像傅立叶变换的物理意义

图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域,对应的频率值较高。

从纯粹的数学意义上看,傅立叶变换是将一个函数转换为一系列周期函数来处理的。

从物理效果看,傅立叶变换是将图像从空间域转换到频率域傅立叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数,傅立叶逆变换是将图像的频率分布函数变换为灰度分布函数。

 

对图像而言:

低频分量(低频信号):代表着图像中亮度或者灰度值变化缓慢的区域,也就是图像中大片平坦的区域,描述了图像的主要部分,是对整幅图像强度的综合度量。

高频分量(高频信号):对应着图像变化剧烈的部分,也就是图像的边缘(轮廓)或者噪声以及细节部分。 主要是对图像边缘和轮廓的度量,而人眼对高频分量比较敏感。之所以说噪声也对应着高频分量,是因为图像噪声在大部分情况下都是高频的。

图像进行二维傅立叶变换得到频谱图,就是图像梯度的分布图,如下图所示,右图为左图的频谱图。

注意:频谱图上的各点与图像上各点并不存在一一对应的关系,即使在不移频的情况下也是没有。傅立叶频谱图上我们看到的明暗不一的亮点,实际是上图像上某一点与邻域点差异的强弱,即梯度的大小,也即该点的频率的大小(可以这么理解,图像中的低频部分指低梯度的点,高频部分相反)。

傅立叶变换以前,图像(未压缩的位图)是由对在连续空间(现实空间)上的采样得到一系列点的集合,我们习惯用一个二维矩阵表示空间上各点,则图像可由z = f(x,y)来表示。由于空间是三维的,图像是二维的,因此空间中物体在另一个维度上的关系就由梯度来表示,这样我们可以通过观察图像得知物体在三维空间中的对应关系。为什么要用梯度?因为实际上对图像进行二维傅立叶变换得到频谱图,就是图像梯度的分布图。

 

我的一点理解

我们在学习图像频率滤波,能看出来,频域上操作的效果比空间域上操作的效果好。但是很难理解为什么要这么做。其实可以这么理解,例如,有一幅含噪声的图像,若对图像进行空间域操作,使用均值滤波,那么噪声未知的像素点会被周围像素点求均值取代,可能效果会比原图好一点,但是这对原有图像的有些信息造成损失(像素取均值)。

那么将图像在频率域上进行操作,噪声在频率上反映是高频信息,通过设置相应的滤波器,滤除噪声。然后从频域还原回来。此时图像的有用的信息不会损失。

 

参考资料

[1] http://blog.sina.com.cn/s/blog_8da31aa3010142x8.html

[2] https://blog.csdn.net/Chaolei3/article/details/79443520

[3] http://blog.sina.com.cn/s/blog_a98e39a201012hpp.html#cmt_532CFB31-7F000001-7D764EA9-873-8A0

[4] https://blog.csdn.net/charlene_bo/article/details/70877999

[5] https://blog.csdn.net/yxswhy/article/details/78915737

 

2015-07-02 11:26:43 u013131455 阅读数 549
  • C++ 百万并发网络通信引擎架构与实现 (Socket、全栈...

    本课程由刘远东、张立铜两位工程师将两人在企业多年积累的开发经验结合而成。从基础的网络知识开始由浅入深地讲解如何使用C++实现一套支持百万级别并发的网络通信引擎。包含:高频并发、多线程、多进程、线程池、内存池、软件硬件瓶颈、如何测试优化网络处理能力等技术知识。可以应用在Windows、Linux、Android、IOS系统上。对从事高性能网络处理的前后端开发人员有极大帮助。咨询群:648738912

    13059 人正在学习 去看看 张立铜
图像中的高频分量和低频分量

形象一点说:亮度或灰度变化激烈的地方对应高频成分,如边缘;变化不大的地方对于低频成分,如大片色块区。

比如说,画个直方图,大块区域是低频,小块或离散的是高频。

把图像看成二维函数,变化剧烈的地方就对应高频,反之低频。
举个通俗易懂的例子:
一幅图象,你戴上眼镜,盯紧了一个地方看到的是高频分量。摘掉眼镜,眯起眼睛,模模糊糊看到的就是低频分量。  

图像的高低频是对图像各个位置之间强度变化的一种度量方法。

低频分量:主要对整副图像的强度的综合度量。

高频分量:主要是对图像边缘和轮廓的度量。

如果一副图像的各个位置的强度大小相等,则图像只存在低频分量,从图像的频谱图上看,只有一个主峰,且位于频率为零的位置。

如果一副图像的各个位置的强度变化剧烈,则图像不仅存在低频分量,同时也存在多种高频分量,从图像的频谱上看,不仅有一个主峰,同时也存在多个旁峰。

以上的现象可以通过对傅里叶变换的公式分析得出。

以下所说的积分是对x进行的。

exp(-jwx)的数值变化是均匀的,如果对exp(-jwx)进行积分,则积分值为零.如果对exp(-jwx)乘以一个加权函数f(x),则在对f(x)exp(-jwx)进行积分,积分值不一定为零.如果exp(-jwx)的取值为1时,则对f(x)exp(-jwx)积分,既为对f(x)积分,此时f(x)exp(-jwx)最大,既频谱中的主峰.如果f(x)是常数则, 除w=0处f(x)exp(-jwx)的积分不为零外,在w不为零的其它处,f(x)exp(-jwx)的积分都为零。
2019-11-15 16:35:07 qq_34963853 阅读数 24
  • C++ 百万并发网络通信引擎架构与实现 (Socket、全栈...

    本课程由刘远东、张立铜两位工程师将两人在企业多年积累的开发经验结合而成。从基础的网络知识开始由浅入深地讲解如何使用C++实现一套支持百万级别并发的网络通信引擎。包含:高频并发、多线程、多进程、线程池、内存池、软件硬件瓶颈、如何测试优化网络处理能力等技术知识。可以应用在Windows、Linux、Android、IOS系统上。对从事高性能网络处理的前后端开发人员有极大帮助。咨询群:648738912

    13059 人正在学习 去看看 张立铜

论文
机器之心的介绍
新智元的介绍
pytorch_code

本人理解

类似于图像中包含高频信息和低频信息一样,可将图像的feature map转换成两个频率的特征图,高频的通道描绘快速变换的微小细节,低频通道描绘平滑变换的结构,且将低频通道上的feature map大小缩小为之前的一半,减少空间信息的冗余,并且减少了计算量,扩到了感受野范围,使感受到更多的全局信息。

重点图示

详细操作: Alt

2014-03-11 08:34:25 u014024390 阅读数 1152
  • C++ 百万并发网络通信引擎架构与实现 (Socket、全栈...

    本课程由刘远东、张立铜两位工程师将两人在企业多年积累的开发经验结合而成。从基础的网络知识开始由浅入深地讲解如何使用C++实现一套支持百万级别并发的网络通信引擎。包含:高频并发、多线程、多进程、线程池、内存池、软件硬件瓶颈、如何测试优化网络处理能力等技术知识。可以应用在Windows、Linux、Android、IOS系统上。对从事高性能网络处理的前后端开发人员有极大帮助。咨询群:648738912

    13059 人正在学习 去看看 张立铜

形象一点说:亮度或灰度变化激烈的地方对应高频成分,如边缘,噪音;变化不大的地方对于低频成分,如大片色块区。

画个直方图,大块区域是低频,小块或离散的是高频。

 

把图像看成二维函数,变化剧烈的地方就对应高频,反之低频。
举个通俗易懂的例子:
一幅图象,你戴上眼镜,盯紧了一个地方看到的是高频分量
摘掉眼镜,眯起眼睛,模模糊糊看到的就是低频分量。  

图像的高低频是对图像各个位置之间强度变化的一种度量方法.

低频分量:主要对整副图像的强度的综合度量.

高频分量:主要是对图像边缘和轮廓的度量.

如果一副图像的各个位置的强度大小相等,则图像只存在低频分量,从图像的频谱图上看,只有一个主峰,且位于频率为零的位置.

如果一副图像的各个位置的强度变化剧烈,则图像不仅存在低频分量,同时也存在多种高频分量,从图像的频谱上看,不仅有一个主峰,同时也存在多个旁峰.

以上的现象可以通过对傅里叶变换的公式分析得出.

以下所说的积分是对x进行的.

exp(-jwx)的数值变化是均匀的,如果对exp(-jwx)进行积分,则积分值为零.如果对exp(-jwx)乘以一个加权函数f(x),则在对f(x)exp(-jwx)进行积分,积分值不一定为零.如果exp(-jwx)的取值为1时,则对f(x)exp(-jwx)积分,既为对f(x)积分,此时f(x)exp(-jwx)最大,既频谱中的主峰.如果f(x) 是常数则, 除w=0处f(x)exp(-jwx)的积分不为零外,在w不为零的其它处,f(x)exp(-jwx)的积分都为零.


欢迎登陆我的个人主页,hello2019,查看原文:http://richardliu.cn/

2016-02-24 20:24:44 u011630458 阅读数 5342
  • C++ 百万并发网络通信引擎架构与实现 (Socket、全栈...

    本课程由刘远东、张立铜两位工程师将两人在企业多年积累的开发经验结合而成。从基础的网络知识开始由浅入深地讲解如何使用C++实现一套支持百万级别并发的网络通信引擎。包含:高频并发、多线程、多进程、线程池、内存池、软件硬件瓶颈、如何测试优化网络处理能力等技术知识。可以应用在Windows、Linux、Android、IOS系统上。对从事高性能网络处理的前后端开发人员有极大帮助。咨询群:648738912

    13059 人正在学习 去看看 张立铜

简介

  本篇整理记录利用小波分离图像的高频、低频部分信息。

具体实现

  实现代码参考资料:小波变换 C++ opencv 实现

小波变换

  小波生成和参考资料中一致。小波变换中,首先抽取出原图像的每一行,进行小波分解,获得水平方向的高、低频信息。
接着抽取出原图像的每一列,进行小波分解,获得垂直方向的高、低频信息。
  生成的对应结果如下:
                                                                                
 
                   水平方向                                         垂直方向

区域分离

  如上,我们已经获得了水平、垂直方向的高、低频信息,并保存到了图像中。接着我们首先将这两幅图片都叠加到同一副图像中。
结果开运算、高斯滤波和阀值二值化之后,最终获得比较好的分离掩码结果。
  对应代码如下:
void picDone(Mat mat1, Mat mat2){
    int i, j;
    IplImage tmp;
    CvScalar s;
    float sum = 0;
 
    mat2.copyTo(mask);                                                                                                               
    tmp = mask;
    for(i=0; i< mat2.rows; i++){
        for(j=0; j< mat2.cols; j++){
            mask.at<float>(i,j) = (mat1.at<float>(i,j) + mat2.at<float>(i,j)) / 2;
            if((i==0) && (j==0)){
                sum = mask.at<float>(i,j);  
            }else{
                sum = (sum + mask.at<float>(i,j)) / 2;
            }
        }   
    }
    tmp = mat2;
    cvZero(&tmp);
 
    imshow("mask0", mask);
    morphologyEx(mask, mat2, MORPH_CLOSE, Mat(5,5,CV_8U), Point(-1,-1), 1);
    GaussianBlur(mat2, mask, Size(7,7), 0, 0);
 
    tmp = mask;
    for(i=0; i< mask.rows; i++){
        for(j=0; j< mask.cols; j++){
            s = cvGet2D(&tmp, i, j);
            if(s.val[0] < sum){
                s.val[0] = 0;
                cvSet2D(&tmp, i, j, s);
            }
        }
    }
    imshow("mask", mask);
}
  对应的结果显示如下:
  
                  直接叠加                                          后处理结果
没有更多推荐了,返回首页