OpenCV图像处理使用笔记(六)——图像滤波
前言
1.圖像濾波也叫圖像模糊,是平滑圖像像素常用處理的方式,通常是為了達(dá)到減少圖像噪聲和偽影,或者降低圖像分辨率,OpenCV提供了常用的五種圖像模糊操作。
2.我的這里演示的系統(tǒng)環(huán)境是Linux,IDE是Qt creator,OpenCV的版本是3.30。
圖像模糊
1.簡單模糊
(1)blur()是實現(xiàn)簡單模糊,是最常用的一種圖像模糊方式,目標(biāo)圖像中的每個值都是源圖像相應(yīng)位置一個窗口中像素的平均值。
函數(shù)原型:
參數(shù)說明:
InputArray類型的src,輸入圖像,就是要模糊的圖像,寫Mat類對象即可,該函數(shù)對通道是獨立處理的,且可以處理任意通道數(shù)的圖片,處理圖片深度應(yīng)該是CV_8U,CV_16U,CV_16S,CV_32F,CV_64F之一;
OutputArray類型的dst,輸出圖像,需要和原圖像有一樣的尺寸和類型;比如可以用Mat::clone(()或者copyTo()得到,以源圖片為模板來初始目標(biāo)圖;
Size類型的ksize,內(nèi)核的大小,一般用Size(w,h)的寫法來表示內(nèi)核的大小,例如Size(3,3)就是3×3的核大小,核的大小一般為(3X3),(5X5)等奇數(shù);
Point類型的anchor,表示錨點(即被平滑的那個點),注意有默認(rèn)值Point(-1,-1),如果這個點坐標(biāo)是負(fù)值的話就表示取核中心為錨點;
int類型的borderType,用于推斷圖像外部像素的某種邊界模式,有默認(rèn)值BORDER_DEFAULT,一般不去管它。
(2)代碼演示
void simpleBlur(Mat &src, Mat &dst, int kesize) {if(src.empty()){return;}blur(src,dst,Size(kesize,kesize));string str = to_string(kesize) + "X" + to_string(kesize);//在效果上加文字,對比幾種核的效果putText(dst,str,Point(50,60),FONT_HERSHEY_SIMPLEX,2,Scalar(255,23,0),4,8); }(3)圖像結(jié)果,可以看到幾個核計大小的效果
2.中值濾波
(1)中值濾波是將目標(biāo)圖像每個像素的都替換為圍繞這個像素的矩形領(lǐng)域內(nèi)的平均像素。常用于去掉數(shù)字圖像中的拍攝噪聲。
API
參數(shù)說明:
InputArray src: 輸入圖像,圖像為1、3、4通道的圖像,當(dāng)模板尺寸為3或5時,圖像深度只能為CV_8U、CV_16U、CV_32F中的一個,如而對于較大孔徑尺寸的圖片,圖像深度只能是CV_8U。
OutputArray類型的dst,輸出圖像,需要和原圖像有一樣的尺寸和類型;比如可以用Mat::clone(()或者copyTo()得到,以源圖片為模板來初始目標(biāo)圖;
Size類型的ksize,內(nèi)核的大小,一般用Size(w,h)的寫法來表示內(nèi)核的大小,例如Size(3,3)就是3×3的核大小,核的大小一般為(3X3),(5X5)等奇數(shù);
代碼演示:
void myMedianBlur(Mat &src, Mat &dst, int kesize) {if(src.empty()){return;}medianBlur(src,dst,kesize);string str = to_string(kesize);putText(dst,str,Point(50,60),FONT_HERSHEY_SIMPLEX,2,Scalar(255,23,0),4,8); }運行效果,可以看到幾個核大小的效果:
3.高斯濾波
(1)高斯濾波是通過對輸入數(shù)組的每個點與輸入的高斯濾波模板執(zhí)行卷積計算然后將這些結(jié)果一塊組成了濾波后的輸出數(shù)組。
API:
參數(shù)說明:
InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。它可以是單獨的任意通道數(shù)的圖片,但需要注意,圖片深度應(yīng)該為CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
OutputArray類型的dst,即目標(biāo)圖像,需要和源圖片有一樣的尺寸和類型。比如可以用Mat::Clone,以源圖片為模板,來初始化得到如假包換的目標(biāo)圖。
Size類型的ksize高斯內(nèi)核的大小。其中ksize.width和ksize.height可以不同,但他們都必須為正數(shù)和奇數(shù)。或者,它們可以是零的,它們都是由sigma計算而來。
double類型的sigmaX,表示高斯核函數(shù)在X方向的的標(biāo)準(zhǔn)偏差。
double類型的sigmaY,表示高斯核函數(shù)在Y方向的的標(biāo)準(zhǔn)偏差。若sigmaY為零,就將它設(shè)為sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height計算出來。
int類型的borderType,用于推斷圖像外部像素的某種邊界模式。注意它有默認(rèn)值BORDER_DEFAULT。
(2)代碼演示
void myGaussianBlur(Mat &src, Mat &dst, int kesize) {if(src.empty()){return;}GaussianBlur(src, dst, Size(kesize, kesize), 11, 11, 4);string str = to_string(kesize) + "X" + to_string(kesize);putText(dst,str,Point(50,60),FONT_HERSHEY_SIMPLEX,2,Scalar(255,23,0),4,8); }運行結(jié)果:
4.雙邊濾波
(1)雙邊濾波模板主要有兩個模板生成,第一個是高斯模板,第二個是以灰度級的差值作為函數(shù)系數(shù)生成的模板,然后這兩個模板點乘就得到了最終的雙邊濾波模板,第一個模板是全局模板,所以只需要生成以西,第二個模板需要對每個像素都計算一次。雙邊濾波器比高斯濾波器多了一個高斯方差sigma-d,它是基于空間分布的高斯濾波函數(shù),所以在邊緣附近,離的較遠(yuǎn)的像素不會太多影響到邊緣上的像素,這樣就能對邊緣附近的像素值予以保存,但是由于保存過多的高頻信息,對于彩色圖像里的高頻噪聲,雙邊濾波器不能夠干凈的濾掉,只能夠?qū)τ诘皖l信息進(jìn)行較好的濾除。
API:
參數(shù)說明:
InputArray src: 輸入圖像,Mat類型,圖像必須是8位或浮點型單通道、三通道的圖像。
OutputArray dst: 輸出圖像,和原圖像有相同的尺寸和類型。
int d: 表示在過濾過程中每個像素鄰域的直徑范圍。如果這個值是非正數(shù),則函數(shù)會從第五個參數(shù)sigmaSpace計算該值。
double sigmaColor: 顏色空間過濾器的sigma值,這個參數(shù)的值越大,表明該像素鄰域內(nèi)有月寬廣的顏色會被混合到一起,產(chǎn)生較大的半相等顏色區(qū)域。
double sigmaSpace: 坐標(biāo)空間中濾波器的sigma值,如果該值較大,則意味著顏色相近的較遠(yuǎn)的像素將相互影響,從而使更大的區(qū)域中足夠相似的顏色獲取相同的顏色。當(dāng)d>0時,d指定了鄰域大小且與sigmaSpace五官,否則d正比于sigmaSpace.
int borderType=BORDER_DEFAULT: 用于推斷圖像外部像素的某種邊界模式,有默認(rèn)值BORDER_DEFAULT.
代碼演示:
oid myBilateralFilter(Mat &src, Mat &dst) {if(src.empty()){return;}bilateralFilter(src, dst, 25, 25*2, 35); }圖像效果:
總結(jié)
以上是生活随笔為你收集整理的OpenCV图像处理使用笔记(六)——图像滤波的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV图像处理使用笔记(四)——图
- 下一篇: OpenCV图像处理使用笔记(七)——卷