Finding nearest non-zero pixel

asked 2017-02-07 07:56:46 -0500

updated 2017-02-07 10:11:30 -0500

I've got a binary image noObjectMask (CV_8UC1) and a given point objectCenter (cv::Point). If the objectCenter is a zer-value pixel, I need to find the nearest non-zero pixel starting from the given point.

The number of non-zero points in the whole image can be large (even up to 50%), so calculating distances for each point returned from cv::findNonZero seems to be non-optimal. As the highest probability is that the pixel will be in the close neighborhood, I currently use:

# my prototype script in Python, but the final version will be implemented in C++
if noObjectMask[objectCenter[1],objectCenter[0]] == 0:
        # if the objectCenter is zero-value pixel, subtract sequentially its neighborhood ROIs
        # increasing its size (r), until the ROI contains at least one non-zero pixel
        for r in range(noObjectMask.shape[1]/2):
            rectL = objectCenter[1]-r-1
            rectR = objectCenter[1]+r
            rectT = objectCenter[0]-r-1
            rectB = objectCenter[0]+r
            # Pythonic way of subtracting ROI: noObjectMask(cv::Rect(...))
            rect = noObjectMask[rectL:rectR, rectT:rectB]
            if cv2.countNonZero(rect)>0: break
        nonZeroNeighbours = cv2.findNonZero(rect)
        # calculating the distances between objectCenter and each of nonZeroNeighbours
        # and choosing the closest one

This works okay, as in my images the non-zero pixels are typically in the closest neighborhood (r<=10px), but the processing time increases dramatically with the distance of the closest pixel. Each repetition of countNonZero repeats counting of the previous pixels. This could be improved by incrementing the radius r by more than one, but this still looks a bit clumsy to me.

How to improve the procedure? And ideas? -Thanks!

edit retag flag offensive close merge delete


sturkmen gravatar imagesturkmen ( 2017-02-07 11:19:43 -0500 )edit

Okay, this will show me how far I am from the closest non-zero point, and the local gradient will let me estimate the direction of closest point, right? Seems a good idea...

mstankie gravatar imagemstankie ( 2017-02-10 04:20:57 -0500 )edit