最終更新: mikk_ni3_92 2010年02月09日(火) 19:11:49履歴
現在地 >> メニュー >> OpenCV >> IplImage編07
INDEX:IplImage編06 << IplImage編07 >> IplImage編08
畳み込みの計算は「cvFilter2D関数」がある。
【使い方】
INDEX:IplImage編06 << IplImage編07 >> IplImage編08
畳み込みの計算は「cvFilter2D関数」がある。
【使い方】
- 演算用フィルタデータを用意
- cvMat型にデータを配置
- 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オペレータがある。OpenCVでは「cvSobel関数」を使う。
注意点は次の通り
【Scharrフィルタ】
第5引数にCV_SCHARRを設定すると「Scharrフィルタ」を使用できる。
この時の注意点として次の条件を満たしておく必要がある。
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);//表示用に変換
詳細は略。使用する関数は「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); … …
- IplImage編07::まとめ1(Prewittフィルタ)
- IplImage編07::まとめ2(cvSobel)
- IplImage編07::まとめ3(cvLaplace)
- IplImage編07::まとめ4(cvCanny)