如何找到二值图像的最低点?

How do I find the lowest point of a binary image?

在应用深度学习对象检测和几个图像处理过滤器后,最后我得到了下图。 这是图片

我要找红点坐标系

为了更接近答案,去掉那些不需要的线。我用了面膜,这是最终结果。

我的问题是如何在这张图片的最低点找到一个点?

另一种解决方案是使用 cv2.HoughCircles 来检测图像中的圆形。

我使用了 pyimagesearch 中的示例作为我的代码的基础,并添加了圆的低部分以及 HoughCircles 中检测到的圆的输出。结果如下图:

由于这个函数returns [x, y, r](圆心和半径)你可以很容易地找到圆的最低部分做:

low_point = [x, y + r]

请记住,您可以使用cv2.HoughCircles() 函数的参数

大家可以看看我在this Github page.中使用的Jupyter Notebook。

我使用的代码:

# import the necessary packages
    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
    # load the image, clone it for output, and then convert it to grayscale
    image = cv2.imread('img_circle.png')
    output = image.copy()
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    #cv2.imshow("test", image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


    plt.imshow(image)
    plt.title('my picture')
    plt.show()

    # detect circles in the image
    circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 100,
                               param1=100, param2=40,
                               minRadius = 130, maxRadius = 0)

    # ensure at least some circles were found
    if circles is not None:
        # convert the (x, y) coordinates and radius of the circles to integers
        circles = np.round(circles[0, :]).astype("int")

        # loop over the (x, y) coordinates and radius of the circles
        for (x, y, r) in circles:
            # draw the circle in the output image
            cv2.circle(output, (x, y), r, (0, 255, 0), 4)

            # Draw low point of the circle 
            cv2.rectangle(output, (x - 10, y - 10 + r), (x + 10, y + 10 + r), (0, 0, 255), -1)

        # show the output image
        plt.imshow(np.hstack([image, output]))
        plt.title('my picture')
        plt.show()

        cv2.imwrite( "lowPoint.jpg", np.hstack([image, output]));

如果我没理解错的话,你想找到非黑色图像中最低行的行号。所以你可以这样做:

import cv2
import numpy as np

# Load image
img = cv2.imread('tyre.png',cv2.IMREAD_GRAYSCALE)                                           

# Get X, Y coordinates of non-black pixels
y, x = np.nonzero(img)                                                                            

如果您现在查看 y,您会看到第 246 行是包含任何非黑色像素的最后一行。

# Look at y, specifically y[-1]                                                                                     
array([ 80,  80,  80, ..., 246, 246, 246])