OpenCV 距离变换的错误输出

Posted

技术标签:

【中文标题】OpenCV 距离变换的错误输出【英文标题】:Wrong output with OpenCV Distance Transform 【发布时间】:2013-01-14 07:39:16 【问题描述】:

我试图找到二进制图像的每个像素的距离变换,使用 C 的 OpenCV 库。根据 DT 的规则,每个零(黑色)像素的值应该是 0。而 255(白色)像素应该是应用距离变换后到零(黑色)像素的最短距离。

我在这里发布代码。

IplImage *im = cvLoadImage("black_white.jpg", CV_LOAD_IMAGE_GRAYSCALE);
IplImage *tmp = cvCreateImage(cvGetSize(im), 32, 1);
cvThreshold(im, im, 128, 255, CV_THRESH_BINARY_INV);
//cvSaveImage("out.jpg", im);
cvDistTransform(im, tmp, CV_DIST_L1, 3, 0, 0 );
d = (uchar*)tmp->imageData;
da = (uchar*)im->imageData;

for(i=0;i<tmp->height;i++)
                          for(j=0;j<tmp->width;j++)
                          
                                                   //if((int)da[i*im->widthStep + j] == 255)
                                                   fprintf(f, "pixel value = %d DT = %d\n", (int)da[i*im->widthStep + j], (int)d[i*tmp->widthStep + j]);
                          
                          cvShowImage("H", tmp);
                          cvWaitKey(0);
                          cvDestroyWindow("H");
fclose(f);

我将像素值及其 DT 值写入文件。事实证明,一些 0 像素的 DT 值为 65、128 等,即它们不是 0。此外,我还有一些 DT 值为 0 的白色像素(我猜这不会发生至少应为 1)。

我们将不胜感激。

提前致谢。

【问题讨论】:

你图像的分辨率是多少?一个建议..尝试调整窗口大小...增大窗口大小并检查... 分辨率范围从 600X800 到 1600X1200 左右。但这会影响 DT 的结果吗? 这里您的窗口是 3x3....尝试更大的窗口...10x10 或 20x20...n 请告诉我们您的结果是否有所改善.. 唯一可能的掩码是 3X3 或 5X5。即使我使用 IplConvKernel,也只能使用值 3 (3X3)、5 (5X5)。是否有可能建造更大的窗户。 对不起,我猜我错了。您可以构建一个更大的窗口。我创建了一个大小为 10X10 的窗口,但我无法在 cvDistTrans 函数中使用它。说它只需要大小为 3 或 5 或 0 的窗口(掩码)。 【参考方案1】:

我猜这是因为CV_THRESH_BINARY_INV 反转了您的图像。因此,对于 DT,您期望为白色的区域实际上是黑色的。

当然,反转图像可能是您的意图。显示图片im并与tmp对比验证

【讨论】:

以上是关于OpenCV 距离变换的错误输出的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的 OpenCV 距离变换结果

从 OpenCV 距离变换中得到奇怪的结果

OpenCV 距离变换中的像素索引

OpenCV直线拟合检测

opencv::基于距离变换与分水岭的图像分割

opencv C++极坐标变换