OpenCV:八、模糊圖像

前言

在上一章中描述了繪制圖形與文字,詳細(xì)描述可點(diǎn)擊查看(http://www.itdecent.cn/writer#/notebooks/47386368/notes/77130883)

目標(biāo)

本章中,將學(xué)習(xí)如何:

  • 模糊圖像的意義和作用
  • 模糊原理
  • 模糊方法
  • 代碼演示

模糊圖像的意義和作用

圖像的模糊處理就是將圖像處理的更加模糊,如下圖,左側(cè)是原圖,右側(cè)是經(jīng)過處理后的圖像。

對比圖像.png

正常情況下,我們希望看到清晰的圖像,而不是模糊的圖像。所以很多時(shí)候我們聽說還有一種專門進(jìn)行模糊圖像的操作時(shí),對于初學(xué)者來說有些不可思議,這有什么用呢。要知道模糊圖像只是處理圖像噪聲帶來的副作用,并不是我們的目的。圖像沒有噪聲的時(shí)候,我們用平滑濾波器去模糊圖像干什么呢?還真有一個(gè)重要的應(yīng)用。把上面的圖像使用變得更加模糊。效果如下:
對比圖像.png

我們可以看到,相對原始圖像,一些嬌小的物體已經(jīng)融入背景,看不到了,有些物體即使能看到,亮度也明顯降低。這樣,我們用圖像模糊將圖像中較大的物體保留下來,而其他的物體則消除掉。我們再進(jìn)一步通過二值化處理對模糊后的圖像進(jìn)行操作,將最高亮度的25%作為閾值,低于此閾值的賦為0,高于此閾值的賦為255。經(jīng)過處理后圖像如下:
對比圖像.png

像這樣利用閾值函數(shù)處理并基于物體亮度來消除某些物體的操作時(shí)很典型。當(dāng)我們只想得到感興趣的物體時(shí),通過圖像模糊,可以將那尺寸和亮度較小的物體過濾掉,較大的物體則易于檢測。除了降低噪聲,這就是圖像平滑(模糊)的另一個(gè)重要應(yīng)用:目標(biāo)提取

模糊原理

模糊操作時(shí)圖像處理中最簡單和常用的操作之一,使用該操作的原因之一就為了給圖像預(yù)處理時(shí)減低噪聲。
使用模糊操作的背后是數(shù)學(xué)的卷積計(jì)算:


卷積公式.png

其中權(quán)重核h(k,l)h(k,l)為“濾波系數(shù)”。上面的式子可以簡記為:


卷積公式.png

通常這些卷積算子計(jì)算都是線性操作,所以又叫線性濾波。示例:假設(shè)有6x6的圖像像素點(diǎn)矩陣,進(jìn)行均值濾波。
卷積過程:6x6上面是個(gè)3x3的窗口,從左向右,從上向下移動(dòng),黃色的每個(gè)像素點(diǎn)值之和取平均值賦給中心紅色像素作為它卷積處理之后新的像素值。每次移動(dòng)一個(gè)像素格。
卷積示意圖.png

模糊方法

均值濾波(歸一化濾波)

均值濾波是典型的線性濾波算法,它是指在圖像上對目標(biāo)像素給一個(gè)模板,改模板包括了其周圍的臨近像素(以目標(biāo)像素為中心的周圍8個(gè)像素,構(gòu)成一個(gè)綠波模板,即去掉目標(biāo)像素本身),再用模板中的全體像素的平均值來代替原來像素值。


濾波矩陣.png

再用3x3大小模板進(jìn)行均值濾波。


特殊情況.png

上圖中由于圖像邊框上的像素?zé)o法被模板覆蓋,所以不做處理。這會造成圖像邊緣的缺失。以(2,2)坐標(biāo)的像素點(diǎn)為例:
濾波示例.png

則濾波后的結(jié)果為:


濾波結(jié)果.png

濾波后(2,2)像素點(diǎn)的值由10變?yōu)?,其他像素點(diǎn)也使用相同的處理方式,最終結(jié)果如下:
濾波結(jié)果.png
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;
int main()
{

    Mat srcImage;
    srcImage = imread("http://lena512color.png");
    imshow("均值濾波【原圖】", srcImage);
    Mat dst; // 構(gòu)造目標(biāo)類
    medianBlur(srcImage, dst, 3);
    //blur(srcImage, dst, Size(5, 5)); // 進(jìn)行均值濾波操作
    imshow("均值濾波【處理后】", dst);
    waitKey();
    return 0;
}
椒鹽噪聲處理效果圖.png

高斯噪聲處理效果圖.png

函數(shù)原型: void blur( InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT );
函數(shù)說明:
1.第一個(gè)參數(shù),InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。該函數(shù)對通道是獨(dú)立處理的,且可以處理任意通道數(shù)的圖像,但需要注意,待處理的圖像深度應(yīng)該為CV_8U,CV_16U,CV_16S,CV_32F以及CV_64F之一。
2.第二個(gè)參數(shù),OutputArray類型的dst,即目標(biāo)圖像,需要和源圖像有一樣的尺寸和類型。比如可以用Mat::Clone,以源圖像為模板,來初始化得到相同尺寸和類型的目標(biāo)圖。
3.第三個(gè)參數(shù),Size類型,內(nèi)核的大小。一般這樣寫Size(w,h)來表示內(nèi)核的大?。ㄆ渲校瑆為像素寬度,h為像素高度)。
4.第四個(gè)參數(shù),Point類型的anchor,表示錨點(diǎn)(即被平滑的那個(gè)點(diǎn)),注意他有默認(rèn)值Point(-1,-1)。如果這個(gè)點(diǎn)坐標(biāo)是負(fù)值的話,就表示取核的中心為錨點(diǎn),所以默認(rèn)值Point(-1,-1)表示這個(gè)錨點(diǎn)在核的中心。
5.第五個(gè)參數(shù),int類型的borderType,用于推斷圖像外部像素的某種邊界模式。默認(rèn)值為BORDER_DEFAULT,一般不修改。

中值濾波

中值,中間值,將數(shù)據(jù)從小到大排序后的中間值。用3x3大小模板進(jìn)行中值濾波。


圖像矩陣.png

還是以(2,2)坐標(biāo)的像素點(diǎn)為例:


濾波示例.png

對模板中的9個(gè)數(shù)進(jìn)行從小到大排序:1,1,1,2,2,5,6,6,10。中間值為2。中值濾波后(2,2)坐標(biāo)的像素值變?yōu)?。同理對其他像素點(diǎn)進(jìn)行處理。結(jié)果如下:
中值濾波處理結(jié)果.png
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;
int main()
{

    Mat srcImage;
    srcImage = imread("d://1.png");
    imshow("均值濾波【原圖】", srcImage);
    Mat dst; // 構(gòu)造目標(biāo)類
    medianBlur(srcImage, dst, 3);
    //blur(srcImage, dst, Size(5, 5)); // 進(jìn)行均值濾波操作
    imshow("高斯濾波【處理后】", dst);
    waitKey();
    return 0;
}
處理對比圖.png

函數(shù)原型:void medianBlur( InputArray src, OutputArray dst, int ksize );
函數(shù)說明:
1.第一個(gè)參數(shù),InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。該函數(shù)對通道是獨(dú)立處理的,且可以處理任意通道數(shù)的圖像,但需要注意,待處理的圖像深度應(yīng)該為CV_8U,CV_16U,CV_16S,CV_32F以及CV_64F之一。
2.第二個(gè)參數(shù),OutputArray類型的dst,即目標(biāo)圖像,需要和源圖像有一樣的尺寸和類型。比如可以用Mat::Clone,以源圖像為模板,來初始化得到相同尺寸和類型的目標(biāo)圖。
3.第三個(gè)參數(shù),int類型,內(nèi)核的大小。

雙邊濾波

雙邊濾波是一種非線性的濾波方法,是結(jié)合圖像的空間臨近度和像素值相似度的一種折中處理,同時(shí)考慮空間與信息和灰度相似性,達(dá)到保邊去噪的目的,具有簡單、非迭代、局部處理的特點(diǎn)。之所以能夠達(dá)到保邊去噪的濾波效果是因?yàn)闉V波器由兩個(gè)函數(shù)構(gòu)成:一個(gè)函數(shù)是由幾何空間距離決定濾波器系數(shù),另一個(gè)是由像素差值決定濾波器系數(shù)。雙邊濾波器中,輸出像素的值依賴于領(lǐng)域像素的值的加權(quán)組合。其公式如下:

image.png

權(quán)重系數(shù)w(i,j,k,l)取決于定義域核
定義域核.png

和值域核
值域核.png

的乘積,也就是
image.png

通俗來講就是雙邊濾波模板主要有兩個(gè)模板生成,第一個(gè)是高斯模板,第二個(gè)是以灰度級的差值作為函數(shù)系數(shù)生產(chǎn)的模板,然后這兩個(gè)模板點(diǎn)乘就得到了最終的雙邊濾波模板,第一個(gè)模板是全局模板,所以只需要一次,第二個(gè)模板需要對每個(gè)像素都計(jì)算一次。雙邊濾波器比高斯濾波器多了一個(gè)高斯方差sigma-d,它是基于空間分布的高斯濾波函數(shù),所以在邊緣附近,離的較遠(yuǎn)的像素不會太多影響到邊緣上的像素,這樣就能對邊緣附近的像素值予以保存,但是由于保存過多的高頻信息,對于彩色圖像里的高頻噪聲,雙邊濾波器不能夠干凈的濾掉,只能夠?qū)τ诘皖l信息進(jìn)行較好的濾除。
雙邊濾波器可以很好的保存圖像邊緣細(xì)節(jié)而濾除掉低頻分量的噪音,但是雙邊濾波器的效率不是太高,花費(fèi)的時(shí)間相較于其他濾波器而言也比較長。對于簡單的濾波而言,可以將兩個(gè)sigma值設(shè)置成相同的值,如果值<10,則對濾波器影響很小,如果值>150則會對濾波器產(chǎn)生較大的影響,會使圖片看起來像卡通。
特點(diǎn):
均值模糊無法克服邊緣像素信息丟失缺陷,原因是均值模糊是基于平均權(quán)重。
高斯模糊部分克服了該缺陷,但是無法完全避免,因?yàn)闆]考慮到像素值的不同。
雙邊濾波是保留邊緣的濾波方法,避免了邊緣信息的丟失,保留了圖像輪廓不變。

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;
int main()
{

    /*
    d:計(jì)算的半徑
    sigmaColor:多少差值之內(nèi)的像素會被計(jì)算
    sigmaSpace:如果d>0,那么聲明無效,否則根據(jù)它來計(jì)算d值
    */
    Mat srcImage;
    srcImage = imread("d://1.png");
    imshow("雙邊濾波【原圖】", srcImage);
    Mat dst; // 構(gòu)造目標(biāo)類
    bilateralFilter(srcImage, dst, 15, 150, 3);
    //medianBlur(srcImage, dst, 3);
    //blur(srcImage, dst, Size(5, 5)); // 進(jìn)行均值濾波操作
    imshow("雙邊濾波【處理后】", dst);
    waitKey();
    return 0;
}
雙邊濾波處理結(jié)果.png

函數(shù)原型:void bilateralFilter( InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType = BORDER_DEFAULT );
函數(shù)說明:
1.第一個(gè)參數(shù),InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。該函數(shù)對通道是獨(dú)立處理的,且可以處理任意通道數(shù)的圖像,但需要注意,待處理的圖像深度應(yīng)該為CV_8U,CV_16U,CV_16S,CV_32F以及CV_64F之一。
2.第二個(gè)參數(shù),OutputArray類型的dst,即目標(biāo)圖像,需要和源圖像有一樣的尺寸和類型。比如可以用Mat::Clone,以源圖像為模板,來初始化得到相同尺寸和類型的目標(biāo)圖。
3.第三個(gè)參數(shù),表示在過濾過程中每個(gè)像素鄰域的直徑范圍。如果這個(gè)值是非正數(shù),則函數(shù)會從第五個(gè)參數(shù)sigmaSpace計(jì)算該值。
4.第四個(gè)參數(shù),顏色空間過濾器的sigma值,這個(gè)參數(shù)的值月大,表明該像素鄰域內(nèi)有月寬廣的顏色會被混合到一起,產(chǎn)生較大的半相等顏色區(qū)域。
5第四個(gè)參數(shù),.坐標(biāo)空間中濾波器的sigma值,如果該值較大,則意味著顏色相近的較遠(yuǎn)的像素將相互影響,從而使更大的區(qū)域中足夠相似的顏色獲取相同的顏色。當(dāng)d>0時(shí),d指定了鄰域大小且與sigmaSpace五官,否則d正比于sigmaSpace.
6.第六個(gè)參數(shù),用于推斷圖像外部像素的某種邊界模式,有默認(rèn)值BORDER_DEFAULT.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容