W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
在本教程中,您將學(xué)習(xí)如何使用多種線性濾鏡來平滑使用OpenCV功能的圖像,如:
被稱為內(nèi)核,它只不過是濾波器的系數(shù)。h(k,l)
它有助于將過濾器可視化為跨越圖像滑動的系數(shù)窗口。
假設(shè)圖像為1D,您可以注意到位于中間的像素將具有最大的權(quán)重。其鄰居的權(quán)重隨著它們與中心像素之間的空間距離的增加而減小。
其中是平均值(峰值),\ sigma表示方差(每個變量x和y)μσX?
中值濾波器遍歷信號的每個元素(在這種情況下為圖像),并用其相鄰像素的中位數(shù)(位于估計(jì)像素周圍的正方形鄰域)中替換每個像素。
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
using namespace std;
using namespace cv;
int DELAY_CAPTION = 1500;
int DELAY_BLUR = 100;
int MAX_KERNEL_LENGTH = 31;
Mat src; Mat dst;
char window_name[] = "Smoothing Demo";
int display_caption( const char* caption );
int display_dst( int delay );
int main( void )
{
namedWindow( window_name, WINDOW_AUTOSIZE );
src = imread( "../data/lena.jpg", IMREAD_COLOR );
if( display_caption( "Original Image" ) != 0 ) { return 0; }
dst = src.clone();
if( display_dst( DELAY_CAPTION ) != 0 ) { return 0; }
if( display_caption( "Homogeneous Blur" ) != 0 ) { return 0; }
for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
{ blur( src, dst, Size( i, i ), Point(-1,-1) );
if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }
if( display_caption( "Gaussian Blur" ) != 0 ) { return 0; }
for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
{ GaussianBlur( src, dst, Size( i, i ), 0, 0 );
if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }
if( display_caption( "Median Blur" ) != 0 ) { return 0; }
for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
{ medianBlur ( src, dst, i );
if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }
if( display_caption( "Bilateral Blur" ) != 0 ) { return 0; }
for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
{ bilateralFilter ( src, dst, i, i*2, i/2 );
if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }
display_caption( "End: Press a key!" );
waitKey(0);
return 0;
}
int display_caption( const char* caption )
{
dst = Mat::zeros( src.size(), src.type() );
putText( dst, caption,
Point( src.cols/4, src.rows/2),
FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) );
imshow( window_name, dst );
int c = waitKey( DELAY_CAPTION );
if( c >= 0 ) { return -1; }
return 0;
}
int display_dst( int delay )
{
imshow( window_name, dst );
int c = waitKey ( delay );
if( c >= 0 ) { return -1; }
return 0;
}
OpenCV提供函數(shù)cv :: blur來使用此過濾器進(jìn)行平滑處理。
for(int i = 1; i <MAX_KERNEL_LENGTH; i = i + 2)
{ blur(src,dst,Size(i,i),Point(-1,-1));
if(display_dst(DELAY_BLUR)!= 0){ return 0; }}
我們指定4個參數(shù)(更多詳細(xì)信息,請參閱參考):
它由函數(shù)cv :: GaussianBlur執(zhí)行:
for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
{ GaussianBlur( src, dst, Size( i, i ), 0, 0 );
if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }
這里我們使用4個參數(shù)(更多細(xì)節(jié),請查看OpenCV參考):
這個過濾器由cv :: medianBlur函數(shù)提供:
for(int i = 1; i <MAX_KERNEL_LENGTH; i = i + 2)
{ medianBlur(src,dst,i);
if(display_dst(DELAY_BLUR)!= 0){ return 0; }}
我們使用三個參數(shù):
由OpenCV函數(shù)cv :: bilateralFilter提供
for(int i = 1; i <MAX_KERNEL_LENGTH; i = i + 2)
{ bilateralFilter(src,dst,i,i * 2,i / 2);
if(display_dst(DELAY_BLUR)!= 0){ return 0; }}
我們使用5個參數(shù):
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: