参考:http://blog.csdn.net/charlene_bo/article/details/70877999
图像的频率:灰度值变化剧烈程度的指标,是灰度在平面空间上的梯度。
(1)什么是低频?
低频就是颜色缓慢地变化,也就是灰度缓慢地变化,就代表着那是连续渐变的一块区域,这部分就是低频. 对于一幅图像来说,除去高频的就是低频了,也就是边缘以内的内容为低频,而边缘内的内容就是图像的大部分信息,即图像的大致概貌和轮廓,是图像的近似信息。
(2)什么是高频?
反过来, 高频就是频率变化快.图像中什么时候灰度变化快?就是相邻区域之间灰度相差很大,这就是变化得快.图像中,一个影像与背景的边缘部位,通常会有明显的差别,也就是说变化那条边线那里,灰度变化很快,也即是变化频率高的部位.因此,图像边缘的灰度值变化快,就对应着频率高,即高频显示图像边缘。图像的细节处也是属于灰度值急剧变化的区域,正是因为灰度值的急剧变化,才会出现细节。
另外噪声(即噪点)也是这样,在一个像素所在的位置,之所以是噪点,就是因为它与正常的点颜色不一样了,也就是说该像素点灰度值明显不一样了,,也就是灰度有快速地变化了,所以是高频部分,因此有噪声在高频这么一说。
其实归根到底,是因为我们人眼识别物体就是这样的.假如你穿一个红衣服在红色背景布前拍照,你能很好地识别么?不能,因为衣服与背景融为一体了,没有变化,所以看不出来,除非有灯光从某解度照在人物身上,这样边缘处会出现高亮和阴影,这样我们就能看到一些轮廓线,这些线就是颜色(即灰度)很不一样的地方.
参考:http://blog.csdn.net/u011630458/article/details/50733268
简介
本篇整理记录利用小波分离图像的高频、低频部分信息。
具体实现
实现代码参考资料:小波变换 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);
- }
对应的结果显示如下: