2016-11-05 7 views
0

勾配が緩やかな背景と検出したい鮮明な前景色の画像があります。私はイメージ内に緑色の弧を見つけることを望みます。ただし、緑色の円弧は背景に対して緑色で表示されます(半透明です)。緑色の円弧も1〜2ピクセル幅です。OpenCVで画像からローカル平均色を削除するには

結果として、画像の各ピクセルについて、周囲のピクセルの平均色を差し引きたいと思います。周辺の5x5または10x10ピクセルで十分です。これは、フォアグラウンドの機能を比較的手つかずにしておく必要がありますが、柔らかい背景を削除する必要があります。

これを効率的に行う方法はありますか?それは特に正確である必要はありませんが、1080pイメージで30Hzで実行したいと思います。

Image with soft background and sharp foreground

+1

伝統的な方法は、ぼかしてから引くことです。正確さがそれほど重要ではない場合は、画像を元のサイズの1/4以下に効率的に縮小し、次に小さい画像に比べて小さいぼかし/平均半径を使用します(より速くなります)。減算する前に元のサイズにスケールバックしてください。 –

+1

私はそれをベンチマークしたり実装したりしていませんが、** Scale2xアルゴリズム** http://www.scale2x.it/algorithmは興味深く見え、** CImg **ライブラリに含めることができるほど重要であると考えられました。 –

+2

あなたが気付いているかどうかわかりませんが、各ピクセルから周囲の9x9領域の平均を差し引くと、色の歪みがあります... http://thesetchells.com/a.png –

答えて

1

あなたは、元の画像からというイメージに、単純なボックスぼかしをやった後、減算することでこれを実現することができます

blur(img,blurred,Size(15,15)); 
diff=img-blurred; 

私は1920×1080の画像上でこれを試してみましたブラーが25msのを取り、減算は15msのを取りましたまともな仕様のiMacで。

背景が速く変化していない場合は、2番目のスレッドで数フレーム分のぼかしを計算し、数フレーム後に再計算するまで再使用してください。その後15ms減算45msの処理ではなく、30fpsごとに行う必要があります。

0

背景グラデーションがどのように滑らかに応じて、拡張が続くエッジ検出はあなたのためによく働くかもしれません。

エッジ検出では、サンプルに表示されている3行が出力され、バックグラウンドのグラデーションは破棄されます(滑らかさに応じて)。画像を拡大すると、輪郭がより重要になるようにエッジが太くなります。

としてあなたの元画像上でこのエッジマップを重ねることができます。結果は3色で唯一の3行が含まれている必要があります

Mat src,edges; 
//perform edge detection on src and output in edges. 
Mat result; 
cvtColor(edges,edges,cv2.COLOR_GRAY2BGR);//change mask to a 3 channel image 
subtract(edges,src,result); 
subtract(edges,result); 

。ここから、緑のフィルタリングを選択するためにカラーフィルタリングを適用できます。

関連する問題