最終更新: mikk_ni3_92 2010年02月15日(月) 16:48:20履歴
現在地 >> メニュー >> OpenCV >> IplImage編08
INDEX:IplImage編07 << IplImage編08 >> IplImage編09?
「cvErode」や「cvDilate」では3×3の矩形形状のカーネルが使用される。
5×5等の他のサイズを使いたい、十字形のカーネルを使いたい、といった場合は
独自カーネルを「cvErode」や「cvDilate」の第3引数に使用する必要がある。
INDEX:IplImage編07 << IplImage編08 >> IplImage編09?
収縮は「cvErode関数」を使う
■void cvErode(const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1)
【src,dst】:入力と出力(カラー画像も可能)
【element】:独自カーネル使用時以外はNULLでよい
【iterations】:反復回数
【例】
■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」と同じ
【例】
■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引数に使用する必要がある。
使用するには次の手順を踏む
カーネルを作成するには、「cvCreateStructuringElementEx関数」を使って、
「IplConvKernel型」に各種データを設定する。
■IplConvKernel* cvCreateStructuringElementEx(int cols, int rows, int anchorX, int anchorY, int shape, int* values=NULL)
【cols/rows】:カーネルの横と縦のサイズを指定
【anchorX/anchorY】:アンカー位置
【shape】:カーネルの形状を指定。
【例】
- カーネル作成
- 引数に与える
カーネルを作成するには、「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 → ユーザー定義形状の構造要素
【例】
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関数を使うと次の事が可能である。
■void cvMorphologyEx(const CvArr* src, CvArr* dst, CvArr* temp, IplConvKernel* element, int operation, int iterations=1)
【src/dst/temp】:入力/出力/作業用(これは使用するアルゴリズム次第であったりなかったりする)
【element】:独自カーネル
【operation】:使用する処理
【iterations】:反復回数
作業用データtempが必要かどうかは次の通り
- 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が必要かどうかは次の通り
operation | tempを使うかどうか |
CV_MOP_OPEN | 不要 |
CV_MOP_CLOSE | 不要 |
CV_MOP_GRADIENT | 絶対に必要 |
CV_MOP_TOPHAT | src=dstの場合は必要 |
CV_MOP_BLACKHAT | src=dstの場合は必要 |
- IplImage編08::まとめ1(cvErode)
- IplImage編08::まとめ2(cvDilate)
- IplImage編08::まとめ3(独自カーネル)
- IplImage編08::まとめ4(cvMorphologyEx)