空間濾波

空間濾波是基礎中的基礎。其實就是按塊像素作運算,好比平滑,銳化等等。分爲卷積和相關,其實卷積就是相關的濾波核旋轉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 }

圖像

 

  

 

二階微分爲 拉普拉斯算子

下圖爲兩種不一樣類型的拉普拉斯算子。不復現了

 

相關文章
相關標籤/搜索