現在地 >> メニュー >> OpenCV >> IplImage編08
INDEX:IplImage編07 << IplImage編08 >> IplImage編09?

モルフォロジー

OpenCVでは
  • 収縮:Erosion(エロージョン)
  • 膨張:dilation(ダイレーション)
  • … …
等々、様々なものが用意されている。

収縮

収縮は「cvErode関数」を使う

■void cvErode(const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1)
【src,dst】:入力と出力(カラー画像も可能)
【element】:独自カーネル使用時以外はNULLでよい
【iterations】:反復回数

【例】
IplImage *imgA = cvLoadImage(filename);
… …

//画像の収縮(高い画素値部分が収縮)
cvErode(imgA,imgA,NULL,4);//カラー画像も可能

膨張

膨張は「cvDilate関数」。

■void cvDilate(const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1)
引数の内容は「cvErode」と同じ

【例】
IplImage *imgA = cvLoadImage(filename);
… …

//画像の膨張(低い画素値部分が収縮)
cvDilate(imgA,imgA,NULL,4);//カラー画像も可能

独自カーネル


「cvErode」や「cvDilate」では3×3の矩形形状のカーネルが使用される。
5×5等の他のサイズを使いたい、十字形のカーネルを使いたい、といった場合は
独自カーネルを「cvErode」や「cvDilate」の第3引数に使用する必要がある。

独自カーネルの使用方法

使用するには次の手順を踏む
  1. カーネル作成
  2. 引数に与える

カーネルを作成するには、「cvCreateStructuringElementEx関数」を使って、
「IplConvKernel型」に各種データを設定する。

■IplConvKernel* cvCreateStructuringElementEx(int cols, int rows, int anchorX, int anchorY, int shape, int* values=NULL)
【cols/rows】:カーネルの横と縦のサイズを指定
【anchorX/anchorY】:アンカー位置
【shape】:カーネルの形状を指定。
  • CV_SHAPE_RECT → 矩形の構造要素
  • CV_SHAPE_CROSS → 十字の構造要素
  • CV_SHAPE_ELLIPSE → 楕円の構造要素
  • CV_SHAPE_CUSTOM → ユーザー定義形状の構造要素
【values】:CV_SHAPE_CUSTOMの時に使う。


【例】
IplImage *imgA = cvLoadImage(filename);
… …
//5x5カーネルアンカポイントはカーネルの中心(十字形)
IplConvKernel *cnvK = cvCreateStructuringElementEx(5,5,2,2,CV_SHAPE_CROSS);

//画像の膨張(低い画素値部分が収縮)
cvErode(imgA,imgA,cnvK,4);//カラー画像も可能
	
cvReleaseStructuringElement(&cnvK);
▲使い終わったら、cvReleaseStructuringElement関数で解放する

カーネルを独自の形状にする

カーネルを独自の形状にしたい時には、配列データを用意しそれを設定する。
【例】
int kernel[]=
{
	1,0,0,0,0,
	0,1,0,0,0,
	0,0,1,0,0,
	0,0,0,1,0,
	0,0,0,0,1
};

… …
IplImage *imgA = cvLoadImage(filename);
… …

//5x5カーネルアンカポイントはカーネルの中心
IplConvKernel *cnvK = cvCreateStructuringElementEx(5,5,2,2,CV_SHAPE_CUSTOM,kernel);

//画像の膨張(低い画素値部分が収縮)
cvErode(imgA,imgA,cnvK,4);//カラー画像も可能
	
cvReleaseStructuringElement(&cnvK);

高度なモルフォロジー変換

cvMorphologyEx関数を使うと次の事が可能である。
  • CV_MOP_OPEN - オープニング
  • CV_MOP_CLOSE - クロージング
  • CV_MOP_GRADIENT - モルフォロジー勾配
  • CV_MOP_TOPHAT - トップハット変換
  • CV_MOP_BLACKHAT - ブラックハット変換


■void cvMorphologyEx(const CvArr* src, CvArr* dst, CvArr* temp, IplConvKernel* element, int operation, int iterations=1)
【src/dst/temp】:入力/出力/作業用(これは使用するアルゴリズム次第であったりなかったりする)
【element】:独自カーネル
【operation】:使用する処理
【iterations】:反復回数

作業用データtempが必要かどうかは次の通り
operationtempを使うかどうか
CV_MOP_OPEN不要
CV_MOP_CLOSE不要
CV_MOP_GRADIENT絶対に必要
CV_MOP_TOPHATsrc=dstの場合は必要
CV_MOP_BLACKHATsrc=dstの場合は必要

サンプルコード

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます