天天看點

ubuntun opencv 編譯成64_19、OpenCV圖像平滑處理

平滑有時也稱為模糊,是一種簡單且經常使用的圖像處理操作。平滑有很多原因,但通常是為了減少噪點。但是這樣通常會降低圖像的分辨率。

OpenCV提供了五種不同的平滑操作,每種平滑操作都可以完成不同的平滑操作。所有這些函數中的src和dst參數都是通常的源圖像和目标圖像。每個平滑操作都具有特定于相關操作的參數。其中,唯一的通用參數是最後一個borderType。該參數告訴平滑操作如何處理圖像邊緣的像素。

1、均值平滑和盒子濾波

void cv::blur(

cv::InputArray src,

cv::OutputArray dst,

cv::Size ksize,

cv::Point anchor = cv::Point(-1,-1),

int borderType = cv::BORDER_DEFAULT

);

均值平滑由blur()函數提供,有時也稱為均值濾波。輸出的每個像素都是圍繞輸入中對應像素的視窗(即核心)中所有像素的平均值。該視窗的大小由參數ksize指定。參數anchor可用于指定核心如何與正在計算的像素對齊。預設情況下,anchor的值是cv :: Point(-1,-1),這表示核心應該相對于濾波器居中。在多通道圖像的情況下,每個通道将分開計算。

均值模糊是盒子濾波的特定形式。盒子濾波如果采用歸一化操作,其實就是均值濾波,而非歸一化的盒子濾波用于計算每個像素鄰域内的積分特性。

void cv::boxFilter(

cv::InputArray src,

cv::OutputArray dst,

int ddepth,

cv::Size ksize,

cv::Point anchor = cv::Point(-1,-1),

bool normalize = true,

int borderType = cv::BORDER_DEFAULT

);

函數boxFilter()用于實作盒子濾波。

2、中值濾波

中值濾波用圍繞中心像素的矩形的中值替換原來像值素。中值濾波對于具有較大孤立異常值的圖像(例如數位照片中的散粒噪聲)很有效。這種噪聲一般稱為椒鹽噪聲。中值濾波可以通過選擇中點來忽略這些異常值。

void cv::medianBlur(

cv::InputArray src,

cv::OutputArray dst,

cv::Size ksize

);

medianBlur的參數與其他平滑濾波參數基本相同:源圖像src,目标圖像dst和核心大小ksize。對于medianBlur(),錨點總是被認為是核心的中心。

3、 高斯濾波

高斯濾波可能是最有用的。高斯濾波将圖像中的每個點與高斯核心進行卷積,然後求和以産生輸出:

void cv::GaussianBlur(

cv::InputArray src,

cv::OutputArray dst,

cv::Size ksize,

double sigmaX,

double sigmaY = ,

int borderType = cv::BORDER_DEFAULT

);

對于高斯模糊,參數ksize給出了濾波視窗的寬度和高度。sigmaX參數表示核心在x維上的σ值(半高寬)。sigmaY參數類似地表示y維中的σ值。 如果隻指定x值,并将y值設定為0(其預設值),則y和x值将被視為相等。如果将它們都設定為0,那麼高斯參數将通過以下公式從視窗大小自動确定:

高斯平滑的OpenCV實作也為幾個常見的核心提供了更高的性能優化。具有sigmaX = 的3×3,5×5和7×7核心比其他核心具有更好的性能。高斯模糊支援8位或32位浮點格式的單通道或三通道圖像。

4、 雙邊濾波

void cv::bilateralFilter(

cv::InputArray src,

cv::OutputArray dst,

int d,

double sigmaColor,

double sigmaSpace,

int borderType = cv::BORDER_DEFAULT

);

OpenCV支援的第五種平滑方式為雙邊濾波。雙邊濾波能夠在保留邊緣的同時實作平滑。高斯平滑是考慮圖像中的像素應該在空間上緩慢變化并且與其鄰域相關,而随機噪聲可能變化很大。是以,高斯平滑降低了噪聲,同時保留了信号。但是,這種方法讓邊界也模糊了。雙邊濾波處理時間大大增加,是以提供了一種平滑圖像而不平滑其邊緣的方法。

與高斯平滑一樣,雙邊濾波構造每個像素及其相鄰分量的權重平均值。權重有兩個組成部分,其中第一部分與高斯平滑使用的權重相同。第二個分量也是一個高斯權重,但不是基于與中心像素的空間距離,而是基于中心像素的強度差異。可以将雙邊濾波視為高斯平滑,将相似像素的權重比低的保持高對比度邊緣。這個濾波器的效果通常是将圖像轉換成看起來像是同一場景的水彩畫。這也可以用作分割圖像的輔助手段。

雙邊濾波需要三個參數。第一個是在濾波期間考慮的像素鄰域的直徑d。第二種是在稱為sigma Color的色域中使用的高斯核心的寬度,其類似于高斯濾波器中的σ參數。第三個是空間域中稱為sigmaSpace的高斯核心的寬度。第二個參數越大,将包括在平滑中的強度範圍就越寬。

篩選器大小d對算法的速度有很強的影響。視訊處理的典型值小于或等于5,但非實時應用的典型值可能高達9。可以将d設定為-1,在這種情況下,它将自動從σ空間計算。

例1 opencv各種平滑濾波示意

#include <iostream>
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
 
int main(int argc, char** argv)
{
 Mat srcImg = imread("E:/", 1);
 namedWindow("原始圖像", 0);
 imshow("原始圖像", srcImg);
 
 Mat srcImg1 = imread("E:/", 1);
 namedWindow("高斯噪聲", 0);
 imshow("高斯噪聲", srcImg1);
 
 Mat srcImg2 = imread("E:/", 1);
 namedWindow("椒鹽噪聲", 0);
 imshow("椒鹽噪聲", srcImg2);
 
 Mat boxFilterImg;
 boxFilter(srcImg1, boxFilterImg, -1, Size(5, 5), Point(-1, -1), true);
 namedWindow("盒子濾波", 0);
 imshow("盒子濾波", boxFilterImg);
 
 Mat meanFilterImg;
 blur(srcImg1, meanFilterImg, Size(3, 3));
 namedWindow("均值濾波", 0);
 imshow("均值濾波", meanFilterImg);
 
 Mat gaussFilterImg;
 GaussianBlur(srcImg1, gaussFilterImg, Size(3, 3), 0);
 namedWindow("高斯濾波", 0);
 imshow("高斯濾波", gaussFilterImg);
 
 Mat MedianFilterImage;
 medianBlur(srcImg2, MedianFilterImage, 3);
 namedWindow("中值濾波", 0);
 imshow("中值濾波", MedianFilterImage);
 
 Mat bilaterFilterImg;
 bilateralFilter(srcImg1, bilaterFilterImg, 9, 40, 10);
 namedWindow("雙邊濾波", 0);
 imshow("雙邊濾波", bilaterFilterImg);
 
 waitKey(0);
return 0
}
           

圖1 各種平滑濾波操作結果

圖2 噪聲圖像

繼續閱讀