日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【OpenCV3】平滑处理详解

發(fā)布時(shí)間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【OpenCV3】平滑处理详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

“平滑”通常又稱“模糊”,是一種簡(jiǎn)單常用的圖像處理操作。進(jìn)行平滑處理的原因有很多,但通常是用來去除噪聲和相機(jī)失真,平滑在按照一定的原理來降低圖像分辨率中也有重要應(yīng)用。

OpenCV2和OpenCV3中提供了5種不同的平滑處理方法,每一種都有自己相關(guān)的庫函數(shù),每一個(gè)庫函數(shù)實(shí)現(xiàn)的平滑都略有不同。在所有的平滑操作函數(shù)中,src和dst兩個(gè)參數(shù)都分別代表源圖像和目標(biāo)圖像。除此之外,每一種平滑操作都具有特定的相關(guān)操作參數(shù)。其中,唯一的共同參數(shù)是最后的borderType,這個(gè)參數(shù)表示平滑操作的過程中如何處理圖像的邊緣的像素。

下面將分別對(duì)這5中平滑操作函數(shù)進(jìn)行介紹。


1、cv::blur()

void cv::blur(cv::InputArray src, // 輸入圖像cv::OutputArray dst, // 輸出圖像cv::Size ksize, // 核大小cv::Point anchor = cv::Point(-1,-1), // 錨點(diǎn)位置int borderType = cv::BORDER_DEFAULT // 邊界處理方法 );
cv::blur()又被稱作“簡(jiǎn)單平滑”操作,輸出圖像中的每個(gè)像素值,為窗口中(如核)所有像素的簡(jiǎn)單平均值,窗口的大小通過ksize參數(shù)指定。參數(shù)anchor可以用來指定內(nèi)核是如何與被計(jì)算的像素對(duì)齊的。默認(rèn)情況下,anchor的取值為cv::Point(-1,-1),這意味著,核相對(duì)于濾波器居中。在多通道圖像中,每個(gè)通道需要分別計(jì)算。

cv::blur()實(shí)際上是下面要介紹的cv::boxFilter()的一個(gè)特例,實(shí)際平滑效果如下。



2、cv::boxFilter()

void cv::boxFilter(cv::InputArray src, // 輸入圖像cv::OutputArray dst, // 輸出圖像int ddepth, // 位深(如 CV_8U)cv::Size ksize, // 核大小cv::Point anchor = cv::Point(-1,-1), // 錨點(diǎn)位置bool normalize = true, // 如果是 true, 用box area進(jìn)行劃分int borderType = cv::BORDER_DEFAULT // 邊界處理方法 );


cv::boxFilter()相對(duì)于cv::blur()來說更為通用,后者是前者的一種特殊形式。所謂"盒形濾波器"即為,任意一個(gè)矩形形狀濾波器,其中所有的均相等,通常情況下?= 1,或者?= 1/A,其中A為濾波器的面積,如下圖所示。



二者間的主要區(qū)別在于,cv::boxFilter()可以在非歸一化模式(normalize = false)下運(yùn)行,且輸出圖像的位深可以控制(在cv::blur中,dst的位深始終和src保持一致)。如果ddepth的值設(shè)為-1,則輸出圖像和輸入圖像的位深一致;否則,你可以選擇常用的任何位深(如CV_32F)。平滑效果如下:



3、cv::medianBlur()

void cv::medianBlur(cv::InputArray src, // 輸入圖像cv::OutputArray dst, // 輸出圖像cv::Size ksize // 核大小 );
cv::medianBlur()即通常所說的均值濾波,其主要思想是,用中心像素矩形鄰域內(nèi)的中值來替代中心像素。平滑效果如下:



4、cv::GaussianBlur()

void cv::GaussianBlur(cv::InputArray src, // 輸入圖像cv::OutputArray dst, // 輸出圖像cv::Size ksize, // 核大小double sigmaX, // x方向高斯半寬double sigmaY = 0.0, // y方向高斯半寬int borderType = cv::BORDER_DEFAULT // 邊界處理方法 );
cv::GaussianBlur()即高斯濾波,是最常用的一種濾波方式。其主要思想是,使用高斯核與輸入圖像中的每個(gè)點(diǎn)作卷積運(yùn)算,然后對(duì)卷積結(jié)果進(jìn)行求和,從而得到輸出圖像。

對(duì)于cv::GaussianBlur()而言,參數(shù)ksize用于指定濾波窗口的寬和高;sigmaX為高斯核在x方向上的sigma值;sigmaY為高斯核在y方向上的sigma值;如果你只指定x的值,而將y的值設(shè)為0,則y的值將被認(rèn)為和x相同。如果二者均被指定為0,則高斯參數(shù)則自動(dòng)使用下式進(jìn)行計(jì)算:


下圖是ksize = (5,3), sigmaX = 1, and sigmaY = 0.5的高斯核示例:


平滑效果如下:



5、cv::bilateralFilter()

void cv::bilateralFilter(cv::InputArray src, // 輸入圖像cv::OutputArray dst, // 輸出圖像int d, // 像素臨接大小(最大距離)double sigmaColor, // 顏色權(quán)重函數(shù)寬度參數(shù)double sigmaSpace, // 空間權(quán)重函數(shù)寬度參數(shù)int borderType = cv::BORDER_DEFAULT // 邊界處理方法 );
cv::bilateralFilter(),即雙邊濾波,是一種可以保持圖像邊緣的平滑方法。和高斯濾波類似,雙邊濾波也是通過計(jì)算中像素和鄰域像素的加權(quán)平均所實(shí)現(xiàn)的,只是其權(quán)值由兩部分組成。其中,第一部分和高斯平滑的權(quán)值相同;第二部分也是高斯權(quán)值,但是該權(quán)值并不是基于中心像素的空間距離,而是基于和中心像素點(diǎn)的灰度值的差異。

雙邊濾波函數(shù)有3個(gè)主要參數(shù)(不包括輸入和輸出):第一個(gè)參數(shù)d是濾波過程中的像素鄰域直徑;第二個(gè)參數(shù)是用于顏色域高斯核的參數(shù),稱作sigmaColor,和高斯濾波中的sigma參數(shù)類似;第三個(gè)參數(shù)是空間域中的高斯核寬度,稱作sigmaSpace。平滑效果如下:



2017.03.29




總結(jié)

以上是生活随笔為你收集整理的【OpenCV3】平滑处理详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。