确定OpenCV中像素的平均距离(到图像的中心)

时间:2013-08-08 20:50:07

标签: opencv

我正试图弄清楚如何在OpenCV中进行以下计算。

假设二进制图像(黑/白):

白色像素距图像中心的平均距离。边缘附近大部分白色像素的图像得分较高,而中心附近白色像素最多的图像得分较低。

我知道如何使用循环手动执行此操作,但由于我正在使用Java,我宁愿将其卸载到一组本机的高性能OpenCV调用中。

由于

1 个答案:

答案 0 :(得分:2)

distanceTransform() 几乎你想要什么。不幸的是,它只计算到最近的黑色像素的距离,这意味着必须稍微按摩数据。图片中心只需要包含一个黑色像素,distanceTransform()才能正常工作。

我的方法如下:

  • 将所有黑色像素设置为中间值
  • 将中心像素设置为黑色
  • 在修改后的图片上调用distanceTransform()
  • 使用二进制图像中的白色像素作为遮罩,通过mean()计算平均距离

示例代码如下。它是用C ++编写的,但你应该能够理解这个想法:

cv::Mat img; // binary image
img.setTo(128, img == 0);
img.at<uchar>(img.rows/2, img.cols/2) = 0; // Set center point to zero

cv::Mat dist;
cv::distanceTransform(img, dist, CV_DIST_L2, 3); // Can be tweaked for desired accuracy

cv::Scalar val = cv::mean(dist, img == 255);
double mean = val[0];

话虽如此,我建议你测试这个方法实际上是否比在循环中迭代更快。这种方法比适应API调用所需的处理要多得多。