OpenCV 2.4.3 C++ 平滑處理分析

來源:互聯網
上載者:User

原理

平滑也稱模糊, 是一項簡單且使用頻率很高的影像處理方法。

平滑處理時需要用到一個濾波器。 最常用的濾波器是線性濾波器,線性濾波處理的輸出像素值(例如:)是輸入像素值(例如:)的加權平均:

    

稱為核, 它僅僅是一個加權係數。

均值平滑

下面是一個使用blur函數的均值平滑:

複製代碼 代碼如下:#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include <stdio.h>

using namespace cv;

int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);

if( argc != 2 || !image.data ){
printf("沒有圖片\n");
return -1;
}

namedWindow( "平滑處理-輸入" );
namedWindow( "平滑處理-輸出" );

imshow( "平滑處理-輸入", image );

Mat out;

blur( image, out, Size(3, 3));

imshow( "平滑處理-輸出", out );

waitKey( 0 );
}

blur函數API資料:

使用歸一化塊濾波器進行模糊圖片操作。

C++: void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
參數

src – 輸入圖片,可以使是任意通道數,該函數對通道是獨立處理的,但是深度只能是CV_8U, CV_16U, CV_16S, CV_32F or CV_64F。dst – 輸出圖片,和輸入圖片相同大小和深度。ksize – 模糊核心大小。anchor – 錨點,預設值是(-1,-1),也就是錨點在核心的中心。borderType – 用於判斷映像邊界的模式。

該函數對圖片進行平滑處理利用了下面的核心:

調用blur(src, dst, ksize, anchor, borderType)相當於調用boxFilter(src, dst, src.type(), anchor, true, borderType)。

blur使用的是歸一化塊濾波器,輸出像素值是核視窗內像素值的均值( 所有像素加權係數相等)。

高斯平滑

下面代碼使用了GaussianBlur來實現平滑:

複製代碼 代碼如下:#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include <stdio.h>

using namespace std;
using namespace cv;int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);

if( argc != 2 || !image.data ){
printf("沒有圖片\n");
return -1;
}

namedWindow( "平滑處理-輸入" );
namedWindow( "平滑處理-輸出" );

imshow( "平滑處理-輸入", image );

Mat out;

GaussianBlur( image, out, Size( 3, 3 ), 0, 0 );

imshow( "平滑處理-輸出", out );

waitKey( 0 );
}

GaussianBlur函數API資料:

使用高斯濾波器進行模糊操作

C++: void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)
參數

src – 輸入圖片,可以使是任意通道數,該函數對通道是獨立處理的,但是深度只能是CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.dst – 輸出圖片,和輸入圖片相同大小和深度。ksize – 高斯核心大小。ksize.width和ksize.height允許不相同但他們必須是正奇數。或者等於0,由參數sigma的乘機決定。sigmaX – 高斯核心在X方向的標準差。sigmaY – 高斯核心在Y方向的標準差。如果sigmaY為0,他將和sigmaX的值相同,如果他們都為0,那麼他們由ksize.width和ksize.height計算得出。borderType – 用於判斷映像邊界的模式。

最有用的濾波器 (儘管不是最快的)。 高斯濾波是將輸入數組的每一個像素點與高斯核心卷積將卷積和當作輸出像素值。

參考一維高斯函數,我們可以看見,他是個中間大兩邊小的函數。

所以高斯濾波器其加權數是中間大,四周小的。

其二維高斯函數為:

    

其中 為均值 (峰值對應位置), 代表標準差 (變數 和 變數 各有一個均值,也各有一個標準差)。

中值平滑

使用medianBlur執行中值平滑:

複製代碼 代碼如下:#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include <stdio.h>

using namespace std;
using namespace cv;int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);

if( argc != 2 || !image.data ){
printf("沒有圖片\n");
return -1;
}

namedWindow( "平滑處理-輸入" );
namedWindow( "平滑處理-輸出" );

imshow( "平滑處理-輸入", image );

Mat out;
medianBlur( image, out, 3);

imshow( "平滑處理-輸出", out );

waitKey( 0 );
}

medianBlur函數API資料:

使用中值濾波器進行模糊操作

C++: void medianBlur(InputArray src, OutputArray dst, int ksize)
Parameters:

src – 支援1、3、4通道圖片輸入,當ksize為3或者5時,圖片的深度只能是CV_8U,,CV_16U,或者 CV_32F,對於其他大孔徑尺寸只支援深度為CV_8U。dst – 輸出圖片,和輸入圖片相同大小和深度。ksize – 線性直徑大小,只能是一個大於1的奇數,例如:3, 5, 7 ...

中值濾波將映像的每個像素用鄰域 (以當前像素為中心的正方形地區)像素的中值代替 。

雙邊平滑

使用bilateralFilter執行雙邊平滑:

複製代碼 代碼如下:#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include <stdio.h>

using namespace std;
using namespace cv;int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);

if( argc != 2 || !image.data ){
printf("沒有圖片\n");
return -1;
}

namedWindow( "平滑處理-輸入" );
namedWindow( "平滑處理-輸出" );

imshow( "平滑處理-輸入", image );

Mat out;
bilateralFilter ( image, out, 3, 3*2, 3/2 );

imshow( "平滑處理-輸出", out );

waitKey( 0 );
}

bilateralFilter的API資料:

對一個圖片應用雙邊濾波器。

C++: void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, intborderType=BORDER_DEFAULT )
Parameters:

src – 源必須是8位或者浮點數,1或者3通道圖片。dst – 輸出圖片,和輸入圖片相同大小和深度。d – 在濾波過程中使用的各像素鄰域直徑,如果這是一個非整數,則這個值由sigmaSpace決定。sigmaColor – 色彩空間的標準方差。數值越大,意味著越遠的的顏色會被混進鄰域內,從而使更大的顏色段獲得相同的顏色。sigmaSpace – 座標空間的標註方差。 數值越大,以為著越遠的像素會相互影響,從而使更大的地區足夠相似的顏色擷取相同的顏色。當d>0,d指定了鄰域大小且與sigmaSpace無關。否則,d正比於sigmaSpace。

原理可參考

http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html

目前我們瞭解的濾波器都是為了平滑映像, 問題是有些時候這些濾波器不僅僅削弱了雜訊, 連帶著把邊緣也給磨掉了。 為避免這樣的情形 (至少在一定程度上 ), 我們可以使用雙邊濾波。

類似於高斯濾波器,雙邊濾波器也給每一個鄰域像素分配一個加權係數。 這些加權係數包含兩個部分, 第一部分加權方式與高斯濾波一樣,第二部分的權重則取決於該鄰域像素與當前像素的灰階差值。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.