Determining the average distance of pixels (to the centre of an image) in OpenCV

I'm trying to figure out how to do the following calculation in OpenCV.

Assuming a binary image (black/white):

Average distance of white pixels from the centre of the image. An image with most of its white pixels near the edges will have a high score, whereas an image with most white pixels near the centre will have a low score.

I know how to do this manually with loops, but since I'm working Java I'd rather offload it to a set of high-performance OpenCV calls which are native.

Thanks


distanceTransform() is almost what you want. Unfortunately, it only calculates distance to the nearest black pixel, which means the data must be massaged a little bit. The image needs to contain only a single black pixel at the center for distanceTransform() to work properly.

My method is as follows:

  • Set all black pixels to an intermediate value
  • Set the center pixel to black
  • Call distanceTransform() on the modified image
  • Calculate the mean distance via mean() , using the white pixels in the binary image as a mask
  • Example code is below. It's in C++, but you should be able to get the idea:

    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];
    

    With that said, I recommend you test whether this method is actually any faster than iterating in a loop. This method does a fair bit more processing than necessary to accommodate the API call.

    链接地址: http://www.djcxy.com/p/89756.html

    上一篇: OpenCv代码抛出分割错误(核心转储)Ubuntu 14.04

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