空间滤波

空间滤波是基础中的基础。其实就是按块像素作运算,好比平滑,锐化等等。分为卷积和相关,其实卷积就是相关的滤波核旋转180。学习

下图是相关及卷积spa

 

 

二维相似,对图像进行处理通常使用二维结构。3d

 

 

卷积公式:code

 

 

接下来作一下平滑和锐化滤波的代码复现blog

一、 平滑滤波排序

通常3*3卷积核,求某邻域内均值,也可能对不一样邻域的像素值赋予不一样的权重。总之就是利用邻域的均值来消除噪声。还有排序滤波,其实就是取中值。卷积核的大小通常优图像细节信息来决定。若卷积核大于最小的细节信息,就会把该细节信息模糊掉。平滑滤波操做和深度学习中的pooling很类似。以3*3的卷积核为例,作均值滤波,卷积核选取如下卷积核深度学习

 

 

        

 代码it

 1 void smooth(Mat src)
 2 {
 3     int IMGH = src.rows;
 4     int IMGW = src.cols;
 5     unsigned char* d = src.data;
 6     int step = src.step;
 7     Mat dst(src.size(), CV_8UC1);
 8     unsigned char* s = dst.data;
 9     for (int i = 1; i < IMGH-1; i++)
10     {
11         for (int j = 1; j < IMGW-1; j++)
12         {
13             s[i*step + j] =(d[(i - 1)*step + j - 1] + d[(i - 1)*step + j] * 2 + d[(i - 1)*step + j + 1] + d[i*step + j - 1] * 2 + d[i*step + j] * 4 + d[i*step + j + 1] * 2 + d[(i + 1)*step + j - 1] + d[(i + 1)*step + j] * 2 + d[(i + 1)*step + j + 1])/16;
14         }
15     }
16     imshow("平滑后结果", dst);
17     imshow("原图", src);
18     imwrite("平滑后结果.jpg", dst);
19     imwrite("原图.jpg", src);
20     waitKey(0);
21 }

 

二、 锐化class

锐化就是求梯度,突出边缘信息,也即求梯度。基础

 

 

注意一阶微分和二阶微分的差异,在突变处,二阶变化更明显,能分辨是增长仍是减小,且存在两个突变,双边缘,更能显示细节信息,可是抗噪性很差。

一阶微分分为 罗伯特交叉算子,sobel算子,我通常都使用sobel算子计算。

 

 

前两幅为xy方向的罗伯特交叉算子,后两幅为sobel算子。

 1 void sobel2(Mat src)
 2 {
 3     int IMGH = src.rows;
 4     int IMGW = src.cols;
 5     unsigned char* d = src.data;
 6     int step = src.step;
 7     
 8     Mat px(src.size(), CV_16SC1,Scalar(0));
 9     Mat py(src.size(), CV_16SC1, Scalar(0));
10     Mat pxy(src.size(), CV_16SC1, Scalar(0));
11     int stepxy = px.step;
12     unsigned char* x = px.data;
13     unsigned char* y = py.data;
14     for (int i = 1; i < IMGH - 1; i++)
15     {
16         for (int j = 1; j < IMGW - 1; j++)
17         {
18             x[i*stepxy + j*(stepxy/step)] =abs( d[(i - 1)*step + j - 1]*(-1) + d[(i - 1)*step + j] * (-2) + d[(i - 1)*step + j + 1] *(-1) + d[(i + 1)*step + j - 1] + d[(i + 1)*step + j] * 2 + d[(i + 1)*step + j + 1]);
19             y[i*stepxy + j*(stepxy / step)] = abs(d[(i - 1)*step + j - 1] * (-1) + d[(i - 1)*step + j + 1] + d[i*step + j - 1] * (-2) + d[i*step + j + 1] * 2 + d[(i + 1)*step + j - 1] * (-1) + d[(i + 1)*step + j + 1]);
20         }
21     }
22     addWeighted(px, 0.5, py, 0.5, 0,pxy);
23     Mat px8(src.size(), CV_8UC1, Scalar(0));
24     Mat py8(src.size(), CV_8UC1, Scalar(0));
25     Mat pxy8(src.size(), CV_8UC1, Scalar(0));
26 
27     convertScaleAbs(px, px8);
28     convertScaleAbs(py, py8);
29     convertScaleAbs(pxy, pxy8);
30 
31     imwrite("方向x.jpg", px8);
32     imwrite("方向y.jpg", py8);
33     imwrite("方向xy.jpg", pxy8);
34     waitKey(0);
35 
36 }

图像

 

  

 

二阶微分为 拉普拉斯算子

下图为两种不一样类型的拉普拉斯算子。不复现了

 

相关文章
相关标签/搜索