現在地 >> メニュー >> サンプルコード::OpenCV >> エッジ検出 >> エッジ検出2


問題


以下の画像をグレイスケールで読み込んで、ソーベルフィルタをかけよ。

その他条件:
 出力のスケール変換は関数を「cvConvert関数」を用いる。
 cvConvertScaleAbs()、cvConvertScale()の結果を比べる。

画像

答え


#include <cv.h>
#include <highgui.h>
#include <iostream>

using namespace std;

int main( int argc, char **argv)
{
IplImage *imgA = cvLoadImage( "test3.jpg", CV_LOAD_IMAGE_GRAYSCALE);
if(imgA ==NULL)
{
cout<<"Can't Load Image ." << endl;
std::exit(0);
}


IplImage *tmp = cvCreateImage(cvGetSize(imgA),IPL_DEPTH_16S,1);


/* 絶対値 ver.*/
cvSobel (imgA, tmp, 0, 1);
cvConvertScaleAbs(tmp, imgA);
cvNamedWindow("abs convert",CV_WINDOW_AUTOSIZE);
cvShowImage("abs convert",imgA);

/* 通常 ver.*/
cvConvertScale(tmp, imgA);
cvNamedWindow("nomal convert",CV_WINDOW_AUTOSIZE);
cvShowImage("nomal convert",imgA);


cvReleaseImage(&tmp);
cvReleaseImage( &imgA );

cvWaitKey(0); // 0秒待つ => ずっと入力待ち

cvDestroyWindow("window");

return 0;
}

メモ


「エッジ検出」は、「Sobel」、「Laplacian」、「Canny」の3種類ある。

このうち、処理の都合上、
 「Sobel」、「Laplacian」は「IPL_DEPTH_16S」(符号付16ビット整数)
の「tmp変数(IplImage)」が必要。


データの「16ビット表現」から「8ビット表現」への「スケール変換」は、
「cvConvert関数」を用いる。
http://opencv.jp/opencv/document/opencvref_cxcore_...




スケール変換について


「cvConvertScale()関数」


任意の線形変換によって配列の値を変換する。

つまり、
変換によって「表現できない値」になる場合には,
表現できる「最も近い実軸上の値」で表現する。


「cvConvertScaleAbs()関数」


こちらは、「8ビット符号無し整数型の配列」に変換する。
つまり、
「グレースケール」の「IPL_DEPTH_8U」にあわせて表現してくれる。

 ⇒出力結果ではこちらのほうがより正しいはず...

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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