OpenCV 距离变换输出与输入图像完全一样的图像

标签 opencv

我正在使用 OpenCV 做一些检测工作,我需要使用距离变换。除了 opencv 中的距离变换功能给我一个与我用作源图像完全相同的图像。有人知道我做错了什么吗?这是我的代码的一部分:

cvSetData(depthImage, m_rgbWk, depthImage->widthStep);

//gotten openCV image in "depthImage"           

IplImage *single_channel_depthImage = cvCreateImage(cvSize(320, 240), 8, 1);
cvSplit(depthImage, single_channel_depthImage, NULL, NULL, NULL);

//smoothing
IplImage *smoothed_image = cvCreateImage(cvSize(320, 240), 8, 1);
cvSmooth(single_channel_depthImage, smoothed_image, CV_MEDIAN, 9, 9, 0, 0);

//do canny edge detector
IplImage *edges_image = cvCreateImage(cvSize(320, 240), 8, 1);
cvCanny(smoothed_image, edges_image, 100, 200);

//invert values
IplImage *inverted_edges_image = cvCreateImage(cvSize(320, 240), 8, 1);
cvNot(edges_image, inverted_edges_image);

//calculate the distance transform
IplImage *distance_image = cvCreateImage(cvSize(320, 240), IPL_DEPTH_32F, 1);
cvZero(distance_image);

cvDistTransform(inverted_edges_image, distance_image, CV_DIST_L2, CV_DIST_MASK_PRECISE, NULL, NULL);

简而言之,我对来自 kinect 的图像进行分级,将其转换为单 channel 图像,对其进行平滑处理,运行 canny 边缘检测器,反转值,然后进行距离变换。但是转换后的图像看起来与输入图像完全一样。怎么了?

谢谢!

最佳答案

我认为这里的关键是它们看起来一样。这是我写的一个小程序来显示差异:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
    Mat before = imread("qrcode.png", 0);

    Mat dist;
    distanceTransform(before, dist, CV_DIST_L2, 3);

    imshow("before", before);
    imshow("non-normalized", dist);

    normalize(dist, dist, 0.0, 1.0, NORM_MINMAX);
    imshow("normalized", dist);
    waitKey();
    return 0;
}

在非标准化图像中,您会看到:
enter image description here

这看起来并没有真正改变任何东西,但与值的整体范围 [0, 255] 相比,距离步长非常小(由于 imshow 将图像从 32- bit float to 8-bits for display),我们看不出差异,所以让我们归一化吧……

现在我们明白了:
enter image description here

这些值本身应该是正确的,但在显示时您需要对图像进行归一化以查看差异。

编辑: 这是 dist 矩阵左上角的一个 10x10 小样本,显示这些值实际上不同:

[10.954346, 10.540054, 10.125763, 9.7114716, 9.2971802, 8.8828888, 8.4685974, 8.054306, 7.6400146, 7.6400146;
  10.540054, 9.5850525, 9.1707611, 8.7564697, 8.3421783, 7.927887, 7.5135956, 7.0993042, 6.6850128, 6.6850128;
  10.125763, 9.1707611, 8.2157593, 7.8014679, 7.3871765, 6.9728851, 6.5585938, 6.1443024, 5.730011, 5.730011;
  9.7114716, 8.7564697, 7.8014679, 6.8464661, 6.4321747, 6.0178833, 5.6035919, 5.1893005, 4.7750092, 4.7750092;
  9.2971802, 8.3421783, 7.3871765, 6.4321747, 5.4771729, 5.0628815, 4.6485901, 4.2342987, 3.8200073, 3.8200073;
  8.8828888, 7.927887, 6.9728851, 6.0178833, 5.0628815, 4.1078796, 3.6935883, 3.2792969, 2.8650055, 2.8650055;
  8.4685974, 7.5135956, 6.5585938, 5.6035919, 4.6485901, 3.6935883, 2.7385864, 2.324295, 1.9100037, 1.9100037;
  8.054306, 7.0993042, 6.1443024, 5.1893005, 4.2342987, 3.2792969, 2.324295, 1.3692932, 0.95500183, 0.95500183;
  7.6400146, 6.6850128, 5.730011, 4.7750092, 3.8200073, 2.8650055, 1.9100037, 0.95500183, 0, 0;
  7.6400146, 6.6850128, 5.730011, 4.7750092, 3.8200073, 2.8650055, 1.9100037, 0.95500183, 0, 0]

关于OpenCV 距离变换输出与输入图像完全一样的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8915833/

相关文章:

opencv - 为什么重建模型是使用 SfM(运动结构)的缩放版本?

python - 在python中找到图像中每个框的均值

c++ - 是否可以使用手动输入制作 OpenCV 矩阵?

c++ - 图像旋转给出灰度图像

python - 如何将矩形蒙版放在矩形对象上

c++ - Opencv 2.3.1 的问题

python - 在网络界面中显示以numpy表示的birmap [Python]

python - 如何在图像中绘制多个最大的物体轮廓

python - OpenCV 和 Python 中的引导过滤器