2 つのバイナリ イメージを比較し、その結果として出力を取得したいと考えています。
これどうやってするの ??
cvSobel() を使用してそれを行うことはできますか??
バイナリ画像には白いエッジがあり、白いピクセルなどをカウントする方法はありますか???
ありがとうございました !
2 つのバイナリ イメージを比較し、その結果として出力を取得したいと考えています。
これどうやってするの ??
cvSobel() を使用してそれを行うことはできますか??
バイナリ画像には白いエッジがあり、白いピクセルなどをカウントする方法はありますか???
ありがとうございました !
cv::compare を試してください: http://opencv.willowgarage.com/documentation/cpp/operations_on_arrays.html#cv-compare
cv::Mat img1 = ...
cv::Mat img2 = ...
cv::Mat result = ...
int threshold = (double)(img1.rows * img1.cols) * 0.7;
cv::compare(img1 , img2 , result , cv::CMP_EQ );
int similarPixels = countNonZero(result);
if ( similarPixels > threshold ) {
cout << "similar" << endl;
}
これは、次の論文に基づいて私が書いた関数です。(私のコードを確認する必要があります! それは大歓迎です!) 注意すべき論文: AJ Baddeley: An error metric for binary images
また、作成者は、コードを見つけることができる統計パッケージを持っています。これは「spatstat」www.spatstat.org と呼ばれます。spatstat を使用するには、最初にhttp://www.r-project.org/から R-Stat をダウンロードします。エラー メトリックは、「deltametric」と呼ばれる関数として利用できます。ヘルプ ファイルを表示するには、help(deltametric) と入力します。
コードの説明: この関数の入力は、バイナリ イメージ ファイルである必要がある 2 つのファイル名です! 戻り値は Baddeley エラー メトリック番号です。OpenCV ヘッダーと名前空間も含める必要があります。
float baddeleyerror (const char * a_file, const char* b_file)
{
Mat A,B,Adist,Bdist,Z;
double c=5;
double p=2;
double nelem;
double minval, maxval;
A=imread(a_file,0);
B=imread(b_file,0);
nelem=A.rows*A.cols;
A=A>1;
B=B>1;
distanceTransform(A,Adist,CV_DIST_L1,3);
distanceTransform(B,Bdist,CV_DIST_L1,3);
min(Adist, c, Adist);
min(Bdist, c, Bdist);
minMaxLoc(Adist, &minval, &maxval, 0, 0);
Adist.convertTo(Adist, CV_8UC1, 255/maxval, 1);
minMaxLoc(Bdist, &minval, &maxval, 0, 0);
Bdist.convertTo(Bdist, CV_8UC1, 255/maxval, 1);
pow(abs(Adist-Bdist),p,Z);
return (pow(sum(Z).val[0]/nelem, 1/p));
}
簡単な比較を使用してみませんか?(ピクセルごと)SobelはとにかくO(ピクセル)を取得するため、ピクセルごとに比較しても複雑さは変わりません。