Jamona Mican
Jamona Mican

Reputation: 1654

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

Upvotes: 1

Views: 1877

Answers (1)

Aurelius
Aurelius

Reputation: 11359

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.

Upvotes: 2

Related Questions