我试图弄清楚如何在 OpenCV 中进行以下计算。
假设二值图像(黑/白):
白色像素与图像中心的平均距离。大多数靠近边缘的白色像素的图像得分较高,而靠近中心的白色像素最多的图像得分较低。
我知道如何使用循环手动执行此操作,但由于我正在使用 Java,我宁愿将其卸载到一组本机的高性能 OpenCV 调用。
谢谢
我试图弄清楚如何在 OpenCV 中进行以下计算。
假设二值图像(黑/白):
白色像素与图像中心的平均距离。大多数靠近边缘的白色像素的图像得分较高,而靠近中心的白色像素最多的图像得分较低。
我知道如何使用循环手动执行此操作,但由于我正在使用 Java,我宁愿将其卸载到一组本机的高性能 OpenCV 调用。
谢谢
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 调用所需的处理要多。