1

我想比较两个二进制图像并得到一个输出结果。

我怎样才能做到这一点 ??

我可以使用 cvSobel() 来做到这一点吗?

二进制图像有白色边缘,有没有办法计算白色像素之类的???

谢谢 !

4

3 回答 3

3

尝试 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;
}
于 2011-08-05T09:38:01.950 回答
1

这是我根据以下论文编写的函数。(应该检查我的代码!将不胜感激!)要照顾的论文:AJ Baddeley:二进制图像的错误度量

作者还有一个统计包,可以在其中找到代码。它被称为“spatstat”www.spatstat.org。要使用 spatstat,首先从http://www.r-project.org/下载 R-Stat 。误差度量可用作称为“deltametric”的函数。要查看帮助文件,请键入 help(deltametric)。

代码说明:这个函数的输入两个文件名,应该是二进制图片文件!返回值是 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));
}
于 2012-05-29T09:46:01.627 回答
0

为什么不使用简单的比较?(逐个像素)Sobel 无论如何都会带你 O(pixels),因此逐个像素比较不会改变复杂性。

于 2011-08-05T08:57:15.307 回答