我想比较两个二进制图像并得到输出结果。
我该怎么做?
我可以使用cvSobel()来做到这一点吗?
二进制图像有白色边缘,有没有办法计算白色像素或什么???
谢谢!
答案 0 :(得分: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;
}
答案 1 :(得分:1)
以下是基于以下论文编写的函数。 (一个人应该检查我的代码!非常感谢!) 要照顾的纸张:A J Baddeley:二进制图像的误差度量
此外,作者还有一个统计包,可以找到代码。它被称为“spatstat”www.spatstat.org。要使用spatstat,请先从http://www.r-project.org/下载R-Stat。错误度量标准可用作称为“deltametric”的函数。要查看帮助文件,请键入help(deltametric)。
代码说明: 这个函数输入两个文件名,应该是二进制图像文件!返回值是Baddeley Error度量标准编号。 一个应该包括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));
}
答案 2 :(得分:0)
为什么不使用简单的比较? (逐个像素) Sobel无论如何都会带你O(像素),所以比较像素和像素不会改变复杂性。