Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV和c++;比较两个二进制图像并获得输出(结果)_C++_Image_Opencv_Binary_Edge Detection - Fatal编程技术网

C++ OpenCV和c++;比较两个二进制图像并获得输出(结果)

C++ OpenCV和c++;比较两个二进制图像并获得输出(结果),c++,image,opencv,binary,edge-detection,C++,Image,Opencv,Binary,Edge Detection,我想比较两个二进制图像,并得到一个输出结果 我该怎么做 我可以用cvSobel()来做这个吗 二值图像有白色的边缘,有没有办法计算白色像素或其他东西 谢谢大家! 为什么不直接比较一下呢?(逐像素) 无论如何,Sobel都会让你得到O(像素),所以逐像素比较不会改变复杂性。为什么不使用简单的比较?(逐像素) Sobel无论如何都会带你去O(像素),所以逐像素比较不会改变复杂性。试试cv::compare: cv::Mat img1=。。。 cv::Mat img2=。。。 cv::Mat结果=。

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

我该怎么做

我可以用cvSobel()来做这个吗

二值图像有白色的边缘,有没有办法计算白色像素或其他东西


谢谢大家!

为什么不直接比较一下呢?(逐像素)
无论如何,Sobel都会让你得到O(像素),所以逐像素比较不会改变复杂性。

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

试试cv::compare:

cv::Mat img1=。。。
cv::Mat img2=。。。
cv::Mat结果=。。。
整数阈值=(双精度)(img1.rows*img1.cols)*0.7;
cv::比较(img1、img2、结果、cv::CMP_EQ);
int similarPixels=countNonZero(结果);
如果(相似像素>阈值){
cout尝试cv::比较:

cv::Mat img1=。。。
cv::Mat img2=。。。
cv::Mat结果=。。。
整数阈值=(双精度)(img1.rows*img1.cols)*0.7;
cv::比较(img1、img2、结果、cv::CMP_EQ);
int similarPixels=countNonZero(结果);
如果(相似像素>阈值){

cout这是我根据以下文章编写的函数(请检查我的代码!非常感谢!) 需要关注的论文:A J Baddeley:二值图像的误差度量

此外,作者还有一个统计软件包,可以在其中找到代码。该软件包名为“spatstat”,www.spatstat.org。要使用spatstat,请首先从下载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));
}

这是我根据下面的文章编写的一个函数。(应该检查我的代码!非常感谢!) 需要关注的论文:A J Baddeley:二值图像的误差度量

此外,作者还有一个统计软件包,可以在其中找到代码。该软件包名为“spatstat”,www.spatstat.org。要使用spatstat,请首先从下载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));
}

请澄清你所说的比较是什么意思。我真的不明白你想做什么。比较两幅图像的预期结果是什么?一幅图像?一个数字?当然可以使用sobel过滤器查找边缘。你想比较两幅图像的边缘吗?你想做卷积来检测EGDE是否相互重叠?请澄清你的意思是比较。我真的不明白你想做什么。两幅图像比较的预期结果是什么?一幅图像?一个数字?当然可以使用sobel过滤器查找边缘。你想比较两幅图像的边缘吗?你想做卷积来检测EGDE是否相互重叠吗?