均值濾波
一、目的與原理
(1)目的:去除圖像上的尖銳噪聲,平滑圖像。
(2)原理:均值濾波屬於線性濾波,它的實現原理是鄰域平均法。其中,公式①的Sxy表示中心點在(x,y)處,M表示大小為m×n的濾波器窗口,M=(2m+1)(2n+1),m和n可以相等。實際上就是用取均值的方式替換原圖像中的像素值,即選擇一個大小為M模板,該模板由其近鄰的若干像素組成,求模板中所有像素的均值,最后填充到輸出圖像中。g(s , t)表示原始圖像, f(x,y)表示均值濾波后得到的圖像。
公式①:
其中,M =(2m+1)(2n+1),m和n可以相等;
以3*3卷積核示例,對於均值濾波來講,雖然每個像素點的權重都為1,但是還是需要用到卷積核,因為3*3的均值濾波核5*5的均值濾波效果是不一樣的,所以卷積核還是不能忽略。而且在此引用卷積核的概念還能更加直觀的看到我們的取點方式。
3*3的核示例:
二、算法步驟
(1)判斷卷積核是否為偶數,如果是偶數就退出;
(2)邊緣處理;
(3)判斷圖片的通道數,單通道和多通道需要分開處理;
(4)通過公式①計算各點的值;
(5)將各點的值存儲到Mat對象中
(6)顯示Mat對象,查看均值濾波處理后的結果;
三、偽代碼
輸入:待處理圖像src,輸出圖像dst,卷積核大小wsize
輸出:引用的方式輸出圖像dst
Void AverFilter(Mat& src, Mat& dst, Size wsize)
{
If(卷積核Ksize為偶數)
報異常,退出
邊緣處理
If(圖片通道數等於1){
單通道的方式求像素點均值
處理結果賦值到輸出圖像中
}
If(圖片通道數大於1){
多通道的方式求像素點均值
處理結果賦值到輸出圖像中
}
}
四、特點
優點:效率高
缺點:不能很好地保護圖像細節,在圖像去噪的同時也破壞了圖像的細節部分,從而使圖像變得模糊,不能很好地去除噪聲點。
五、源碼
void MeanFilater(Mat& src, Mat& dst, Size wsize) { //判斷矩陣的行列數為奇數 if (wsize.height % 2 == 0 || wsize.width % 2 == 0) { fprintf(stderr, "Please enter odd size!"); exit(-1); } int hh = (wsize.height - 1) / 2; int hw = (wsize.width - 1) / 2; //邊緣處理 Mat Newsrc; copyMakeBorder(src, Newsrc, hh, hh, hw, hw, BORDER_REFLECT_101);//以邊緣為軸,對稱 dst = Mat::zeros(src.size(), src.type()); int sum1 = 0, sum2 = 0, sum3 = 0; int average1 = 0, average2 = 0, average3 = 0; for (int i = hh; i < src.rows + hh; i++) { //Vec3b* src_rows_ptr = Newsrc.ptr<Vec3b>(i); for (int j = hw; j < src.cols + hw; j++) { for (int r = i - hh; r <= i + hh; r++) { Vec3b* new_ptr = Newsrc.ptr<Vec3b>(r); for (int k = j - hh; k <= j + hh; k++) { sum1 += new_ptr[k][0]; sum2 += new_ptr[k][1]; sum3 += new_ptr[k][2] ; } } average1 = sum1 / (wsize.area()); average2 = sum2 / (wsize.area()); average3 = sum3 / (wsize.area()); Vec3b* dst_ptr = dst.ptr<Vec3b>(i - hh); dst_ptr[j - hw][0] = average1; dst_ptr[j - hw][1] = average2; dst_ptr[j - hw][2] = average3; sum1 = 0, sum2 = 0, sum3 = 0; average1 = 0, average2 = 0, average3 = 0; } } }
六、結果圖
卷積核為3*3
卷積核為5*5