モルフォロジー演算
■ モルフォロジー演算
モルフォロジーは,与えられた2値画像または濃淡画像からの特徴抽出を目的とした集合的操作からなる対象図形の変形手法の理論体系であり,その演算は処理対象画像と構造要素との間の集合演算で定義されている.OpenCVでは,モルフォロジー演算の,Dilation, Erosion, Opening, Closingの基本演算に加えて,モルフォロジーグラジエント(Dailationした画像からErosionした画像を減算することで,エッジを検出する),トップハット変換(元画像からOpeningした画像を減算する),ブラックハット変換(Closingした画像から元画像を減算する)の7種類の演算が実装されている.また,モルフォロジー演算に用いる構造要素はユーザが自由に生成する事ができる.画像のノイズ除去,平滑化,形状記述,テクスチャ解析,細線化処理などに用いられる.
サンプル
モルフォロジー変換
構造要素を指定して,様々なモルフォロジー演算を行なう.
サンプルコード
#include <cv.h>
#include <highgui.h>
/* メインプログラム */
int
main (int argc, char **argv)
{
IplImage *src_img = 0;
IplImage *dst_img_dilate, *dst_img_erode;
IplImage *dst_img_opening, *dst_img_closing;
IplImage *dst_img_gradient, *dst_img_tophat, *dst_img_blackhat;
IplImage *tmp_img;
IplConvKernel *element;
//(1)画像の読み込み,演算結果画像領域の確保を行なう
if (argc >= 2)
src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if (src_img == 0)
exit (-1);
dst_img_dilate = cvCloneImage (src_img);
dst_img_erode = cvCloneImage (src_img);
dst_img_opening = cvCloneImage (src_img);
dst_img_closing = cvCloneImage (src_img);
dst_img_gradient = cvCloneImage (src_img);
dst_img_tophat = cvCloneImage (src_img);
dst_img_blackhat = cvCloneImage (src_img);
tmp_img = cvCloneImage (src_img);
//(2)構造要素を生成する
element = cvCreateStructuringElementEx (9, 9, 4, 4, CV_SHAPE_RECT, NULL);
//(3)各種のモルフォロジー演算を実行する
cvDilate (src_img, dst_img_dilate, element, 1);
cvErode (src_img, dst_img_erode, element, 1);
cvMorphologyEx (src_img, dst_img_opening, tmp_img, element, CV_MOP_OPEN, 1);
cvMorphologyEx (src_img, dst_img_closing, tmp_img, element, CV_MOP_CLOSE, 1);
cvMorphologyEx (src_img, dst_img_gradient, tmp_img, element, CV_MOP_GRADIENT, 1);
cvMorphologyEx (src_img, dst_img_tophat, tmp_img, element, CV_MOP_TOPHAT, 1);
cvMorphologyEx (src_img, dst_img_blackhat, tmp_img, element, CV_MOP_BLACKHAT, 1);
//(4)モルフォロジー演算結果を表示する
cvNamedWindow ("src", CV_WINDOW_AUTOSIZE);
cvNamedWindow ("dilate", CV_WINDOW_AUTOSIZE);
cvNamedWindow ("erode", CV_WINDOW_AUTOSIZE);
cvNamedWindow ("opening", CV_WINDOW_AUTOSIZE);
cvNamedWindow ("closing", CV_WINDOW_AUTOSIZE);
cvNamedWindow ("gradient", CV_WINDOW_AUTOSIZE);
cvNamedWindow ("tophat", CV_WINDOW_AUTOSIZE);
cvNamedWindow ("blackhat", CV_WINDOW_AUTOSIZE);
cvShowImage ("src", src_img);
cvShowImage ("dilate", dst_img_dilate);
cvShowImage ("erode", dst_img_erode);
cvShowImage ("opening", dst_img_opening);
cvShowImage ("closing", dst_img_closing);
cvShowImage ("gradient", dst_img_gradient);
cvShowImage ("tophat", dst_img_tophat);
cvShowImage ("blackhat", dst_img_blackhat);
cvWaitKey (0);
cvDestroyWindow ("src");
cvDestroyWindow ("dilate");
cvDestroyWindow ("erode");
cvDestroyWindow ("opening");
cvDestroyWindow ("closing");
cvDestroyWindow ("gradient");
cvDestroyWindow ("tophat");
cvDestroyWindow ("blackhat");
cvReleaseImage (&src_img);
cvReleaseImage (&dst_img_dilate);
cvReleaseImage (&dst_img_erode);
cvReleaseImage (&dst_img_opening);
cvReleaseImage (&dst_img_closing);
cvReleaseImage (&dst_img_gradient);
cvReleaseImage (&dst_img_tophat);
cvReleaseImage (&dst_img_blackhat);
cvReleaseImage (&tmp_img);
return 1;
}
// (1)画像の読み込み,演算結果画像領域の確保を行なう
コマンド引数で指定されたファイル名の画像(入力画像)をオープンし,関数 cvLoadImage()で読み込む.また,出力用画像の領域を,入力画像をコピーすることで確保する.高度なモルフォロジー演算cvMorphologyEx()を行なう場合はテンポラリの領域が必要となる(モルフォロジー勾配の時と、インプレースモードでのトップハット変換 と ブラックハット変換の場合)ので,tmp_imgとして用意している.
// (2)構造要素を生成する
モルフォロジー演算に使用する構造要素を生成する.サンプルプログラムでは,9×9の矩形で、ちょうどその矩形の中心にアンカーポイントを持つような構造要素を指定している.
// (3)各種のモルフォロジー演算を実行する
OpenCVに用意されているすべてのモルフォロジー演算の実行を行ない,結果をそれぞれの出力領域に保存する.
// (4)モルフォロジー演算結果を表示する
ウィンドウを生成し,各種モルフォロジー検出結果を表示し,何かキーが押されるまで待つ.
実行結果例
入力画像と演算結果
[上段左から] 入力画像(2値画像),Dilation,Erosion,Opening
[下段左から]Closing,グラジエント,トップハット変換,ブラックハット変換
[上段左から] 入力画像(カラー画像),Dilation,Erosion,Opening
[下段左から]Closing,グラジエント,トップハット変換,ブラックハット変換