一:概念:
濾波是信號處理機圖像處理中的一個基本操作。濾波去除圖像中的噪聲,提取感興趣的特征,允許圖像重采樣。
圖像中的頻域和空域: 空間域指用圖像的灰度值來描述一幅圖像 ;而 頻域指用圖像灰度值的變化來描述一幅圖像 。而低通濾波器和高通濾波器的概念就是在頻域中產生的。
低通濾波器指去除圖像中的高頻成分,而高通濾波器指去除圖像中的低頻成分。
后面將介紹低通濾波器—均值和高斯濾波器;中值濾波器—非線性濾波器;高通濾波器—sobel 算子(方向濾波器)和拉普拉斯變換(二階導數)。其中利用方向濾波器和拉普拉斯變換可以對圖像的邊緣進行檢測。
二:低通濾波器
<1>cv::blur函數: 每個像素替換為相鄰矩形內像素的平均值
<2>cv::GaussianBlur函數: 通過高斯核來進行替換
Code:
?
Mat result; // 線性平滑 濾波 每個像素替換為相鄰矩形內像素的平均值 blur(image, result,Size(5,5)); // filter2D可以自定義核進行線性濾波 Mat gauResult; GaussianBlur(image, gauResult, Size(5,5), 1.5); // 高斯平滑 模糊 線性濾波器
?
Result:
sourceImage:
BlurResult:
GaussianBlur:
低通濾波器的效果是對圖像進行模糊和平滑,減弱了物體邊緣可見的快速變化。它是一種線性濾波器,原理是與核進行卷積運算,此時的核內定,當我們需要指定核函數進行卷積時可以用filter2D函數,它的使用見blog: http://blog.csdn.net/lu597203933/article/details/16811851 。?
三:中值濾波器
中值濾波器是非線性濾波器, 它的原理是僅僅計算這組數的中值,并用中值替換當前的像素值 。因此對于去除椒鹽噪點非常有用。
Code:
?
Mat medianResult; medianBlur(image, medianResult,5); // 是一個非線性的濾波器,利用中值替換當前的像素值,對于去除椒鹽噪點尤為有用
?
Result:
?
三:方向濾波器—sobel算子
Sobel算子就是通過卷積操作來計算圖像的一階導數,由于邊緣處圖像灰度變化率較大,因此可以用sobel算子來進行邊緣檢測。Sobel算子的核定義為:
y坐標軸:
x坐標軸:
Sobel函數:Sobel(InputArray src, OutputArray dst, int ddepth,
???????????????????????? int dx, int dy, int ksize=3,
???????????????? ???????? double scale=1, double delta=0,
???????????????????????? int borderType=BORDER_DEFAULT );
其中ddepth為圖像類型, (dx,dy) = (1,0)為x方向導數,(dx,dy) = (0,1)為y方向導數,scale和delta的作用是再保存前可以對圖像進行縮放,公式為:dst =dst * scale + delta.
Code:
?
int main() { Mat image = imread("F:\\lena.png", 0); if(!image.data) { cout << "Fail to load image" << endl; return 0; } Mat sobel_x, sobel_y; //Sobel(image, sobel_x, CV_8U, 1, 0, 3, 0.4, 128); //Sobel(image, sobel_y, CV_8U, 0, 1, 3, 0.4, 128); Sobel(image, sobel_x, CV_16S, 1, 0); // 因為后面要相加 所以用16位有符號的整數來表示 另外導數肯定含有負數 Sobel(image, sobel_y, CV_16S, 0, 1); Mat sobel; sobel = abs(sobel_x) + abs(sobel_y); double sobmin, sobmax; minMaxLoc(sobel, &sobmin, &sobmax); Mat sobelImage; sobel.convertTo(sobelImage, CV_8U, -255.0/sobmax, 255); // 等價于 saturate_cast(a*sobel + b) Mat sobelThresholded; int thre = 200; threshold(sobelImage, sobelThresholded, thre, 255, THRESH_BINARY); namedWindow("sobelImage", 0); imshow("sobelImage", sobelImage); namedWindow("sobelThresholded", 0); imshow("sobelThresholded", sobelThresholded); waitKey(0); return 0; }
?
Result:
當然除了sobel算子,還有其它的算子,如Scharr算子,它更精確、快。它的核為:
?
Sobel(image, sobelX, CV_16S, 1, 0,CV_SCHARR);
或者:
Scharr(image, scharrX, CV_16S, 1, 0, 3);
四:拉普拉斯變換
拉普拉斯變化時基于圖像導數的高通濾波器,計算二階導數以衡量圖像的彎曲度
Code:
?
int main() { Mat image = imread("F:\\lena.png", 0); if(!image.data) { cout << "Fail to load image" << endl; return 0; } Mat laplacian; Laplacian(image, laplacian, CV_16S, 3); // 二階導數肯定含有負數。。 基于圖像導數的高通濾波器,計算二階導數以衡量圖像的彎曲度 laplacian = abs(laplacian); Mat laplacianImage; laplacian.convertTo(laplacianImage, CV_8U); namedWindow("laplacianImage"); imshow("laplacianImage", laplacianImage); waitKey(0); return 0; }
?
Result:
作者:小村長 ?出處:
http://blog.csdn.net/lu597203933
?歡迎轉載或分享,但請務必聲明文章出處。 (新浪微博:小村長zack, 歡迎交流!)
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
