UbuntuOpencvイメージスムージング
1 背景知識
スムージングは、ブラーとも呼ばれ、シンプルで頻繁に使用される画像処理方法です。平滑化にはフィルターが必要です。最も一般的に使用されるフィルターは線形フィルターです。線形フィルタープロセスの出力ピクセル値(g(i、j))は、入力ピクセル値(f(i + k、j + l))の加重和です。
カーネルと呼ばれる、それは単なる重み係数です。フィルタは、重み係数を含むウィンドウと考えてください。このフィルタを使用して画像を滑らかにする場合は、ウィンドウを画像全体にスライドさせます。
1.1 平均フィルター
最も単純なフィルターである出力ピクセル値は、カーネルウィンドウ内のピクセル値の平均値です(すべてのピクセルの重み係数は同じです)。カーネルは次のとおりです。
1.2 ガウスフィルター
ガウスフィルタリングは、入力配列の各ピクセルをガウスカーネルで畳み込み、畳み込みの合計を出力ピクセル値として使用することです。
画像が一次元であると仮定すると、上図を見ると、中央のピクセルの重み係数が最大であり、周辺のピクセルの重み係数は、それらの間の距離が大きくなるにつれて徐々に減少することがわかります。
1.3 メディアンフィルター
中央値フィルタリングは、画像の各ピクセルを近傍(現在のピクセルを中心とする正方形の領域)ピクセルの中央値に置き換えます。
1.4 バイラテラルフィルター
現在私たちが理解しているフィルターはすべて画像を滑らかにするためのものです。問題は、これらのフィルターがノイズを減衰させるだけでなく、エッジを滑らかにすることもあるということです。この状況を(少なくともある程度は)回避するために、バイラテラルフィルタリングを使用できます。ガウスフィルターと同様に、バイラテラルフィルターも隣接する各ピクセルに重み係数を割り当てます。これらの重み係数は2つの部分で構成されます。最初の部分はガウスフィルタリングと同じ重み方法を持ち、2番目の部分の重みは隣接するピクセルと現在のピクセルのグレースケールの違いに依存します。
2 Opencvの実装
最初のステップ:C ++ソースプログラムを作成します。
using namespace std;using namespace cv;
///グローバル変数intDELAY_CAPTION = 1500; int DELAY_BLUR = 100; int MAX_KERNEL_LENGTH = 31;
Mat src; Mat dst;char window_name[] = "Filter Demo 1";
///関数宣言intdisplay_caption(char * caption); int display_dst(int delay);
/** * メイン機能*/
int main( int argc, char** argv )
{
namedWindow( window_name, CV_WINDOW_AUTOSIZE );
///元の画像を読み込みます
src = imread( "../images/lena.jpg", 1 );
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( char* caption )
{
dst = Mat::zeros( src.size(), src.type() );
putText( dst, caption,
Point( src.cols/4, src.rows/2),
CV_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;
}
2番目のステップはCMmakeLists.txtを書くことです
次に、プログラムをコンパイルします。
ステップ3:プログラムをコンパイルする
1> cmakeを実行します。
cmake .
2> makeを実行します
Make
3> ./displayを実行します
4> 結果(ビデオ表示)
ビデオコンテンツ
3 総括する
Opencv実験は、ソフトウェアイメージ処理プロセスのすべての人の理解を深めまたは促進し、ハードウェア実装の方法またはアイデアを提供することを目的としています。