空間濾波是基礎中的基礎。其實就是按塊像素作運算,好比平滑,銳化等等。分爲卷積和相關,其實卷積就是相關的濾波核旋轉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 }
圖像
二階微分爲 拉普拉斯算子
下圖爲兩種不一樣類型的拉普拉斯算子。不復現了