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

たたみこみカーネル


畳み込みの計算は「cvFilter2D関数」がある。
【使い方】
  1. 演算用フィルタデータを用意
  2. cvMat型にデータを配置
  3. cvFilter2D関数を使う
//Prewittフィルタ
float Prewitt[3][3]=
{
        {1,1,1},
        {1,-2,1},
        {-1,-1,-1}
};

IplImage *imgA = ... ...
  
CvMat kernel = cvMat(3,3,CV_32FC1,Prewitt);
cvFilter2D(imgA,imgA,&kernel);

sobel、ラプラシアン、Canny

sobel オペレータ

微分を使ったのエッジ検出法としてSobelオペレータがある。OpenCVでは「cvSobel関数」を使う。
void cvSobel(const CvArr* src, CvArr* dst, int xorder, int yorder, int apertureSize=3)
[xorder、yorder]:各方向における微分の次数を与える。0〜2までOK。0は何もしないことを意味する
[apertureSize]:カーネルサイズ。1,3,5,7が選べる。
【例】
IplImage *imgA = cvLoadImage(filename,0);
… …
//深度16ビットの画像メモリ確保
IplImage *imgA_16 = cvCreateImage(cvGetSize(imgA),IPL_DEPTH_16S,1);

cvSobel(imgA,imgA_16,2,0);//ソーベル(x:2次,y:0次)
cvConvertScaleAbs(imgA_16,imgA);//8bitに戻す
【解説】
注意点は次の通り
  • 入力画像はシングルチャネル。
  • cvSobelの出力は深度が8bitに対し、深度が16bitの画像を用意する。
  • 表示の際は、cvConvertScaleAbs関数などで変換する。

【Scharrフィルタ】
第5引数にCV_SCHARRを設定すると「Scharrフィルタ」を使用できる。
この時の注意点として次の条件を満たしておく必要がある。
  • xorder + yorder = 1
  • xorder >= 0
  • yorder >= 0
【例】
IplImage *imgA = cvLoadImage(filename,0);

//深度16ビットの画像メモリ確保
IplImage *imgA_16 = cvCreateImage(cvGetSize(imgA),IPL_DEPTH_16S,1);

cvSobel(imgA,imgA_16,0,1,CV_SCHARR);//Scharr(dx+dy=1,dx>=0 ,dy>=0)
cvConvertScaleAbs(imgA_16,imgA);//表示用に変換

ラプラシアン

ラプラシアンフィルタは「cvLaplace関数」で行う。
■void cvLaplace(const CvArr* src, CvArr* dst, int apertureSize=3)
[apetureSize]:cvSobelと同じ。
出力画像の条件もcvSobelと同じで、16bitを用意しスケール変換して表示する

【例】
IplImage *imgA = cvLoadImage(filename,0);
… …
//深度16ビットの画像メモリ確保
IplImage *imgA_16 = cvCreateImage(cvGetSize(imgA),IPL_DEPTH_16S,1);
… …
cvLaplace(imgA,imgA_16,3);
cvConvertScaleAbs(imgA_16,imgA);//表示用に変換

Cannyエッジ検出

詳細は略。使用する関数は「cvCanny関数」。
■void cvCanny(const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size=3)
[threshold1]:ヒステリシス閾処理のlowThreshに該当
[threshold2]:ヒステリシス閾処理のhighThreshに該当
[apetureSize]:cvSobelと同じ。
なお、出力画像はcvSobel、cvLaplaceと違って、16bitの画像を用意したり、スケール変換の必要はない。
lowThresh:highThresh=1:2 or 1:3がお勧めっぽい

【例】
IplImage *imgA = cvLoadImage(filename,0);
… …
cvCanny(imgA,imgA,10,20);
… …

サンプルコード

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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