【问题标题】:Finding bright spots in a image using opencv使用opencv查找图像中的亮点
【发布时间】:2019-01-21 15:16:06
【问题描述】:

我想找到上图中的亮点并用一些符号标记它们。为此,我尝试使用 OpenCV 已经提供的 霍夫圆变换 算法。但是当我运行代码时它会给出某种断言错误。我还尝试了 OpenCV 中也提供的 Canny 边缘检测 算法,但它也给出了某种断言错误。我想知道是否有某种方法可以完成这项工作,或者我是否可以防止这些错误消息。

我是 OpenCV 新手,非常感谢任何帮助。

附: - 如果需要,我也可以使用 Scikit-image。因此,如果这可以使用 Scikit-image 完成,请告诉我如何。

下面是我的预处理代码:

import cv2
import numpy as np



image = cv2.imread("image1.png")

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

binary_image = np.where(gray_image > np.mean(gray_image),1.0,0.0)

binary_image = cv2.Laplacian(binary_image, cv2.CV_8UC1)

【问题讨论】:

    标签: python opencv computer-vision image-segmentation scikit-image


    【解决方案1】:

    如果您只是要使用简单的图像,例如您的示例中的黑色背景,您可以使用相同的基本预处理/阈值,然后找到连接的组件。使用此示例代码在图像中的所有圆圈内绘制一个圆圈。

    import cv2 
    import numpy as np
    
    image = cv2.imread("image1.png")
    
    #  constants
    BINARY_THRESHOLD = 20
    CONNECTIVITY = 4
    DRAW_CIRCLE_RADIUS = 4
    
    #  convert to gray
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    #  extract edges
    binary_image = cv2.Laplacian(gray_image, cv2.CV_8UC1)
    
    #  fill in the holes between edges with dilation
    dilated_image = cv2.dilate(binary_image, np.ones((5, 5)))
    
    #  threshold the black/ non-black areas
    _, thresh = cv2.threshold(dilated_image, BINARY_THRESHOLD, 255, cv2.THRESH_BINARY)
    
    #  find connected components
    components = cv2.connectedComponentsWithStats(thresh, CONNECTIVITY, cv2.CV_32S)
    
    #  draw circles around center of components
    #see connectedComponentsWithStats function for attributes of components variable
    centers = components[3]
    for center in centers:
        cv2.circle(thresh, (int(center[0]), int(center[1])), DRAW_CIRCLE_RADIUS, (255), thickness=-1)
    
    cv2.imwrite("res.png", thresh)
    cv2.imshow("result", thresh)
    cv2.waitKey(0)
    

    这是生成的图像:

    编辑:connectedComponentsWithStats 将二进制图像作为输入,并返回该图像中连接的像素组。如果您想自己实现该功能,天真的方法是:
    1- 从左上角到右下角扫描图像像素,直到遇到没有标签 (id) 的非零像素。
    2-当您遇到非零像素时,递归搜索其所有邻居(如果您使用 4 个连接,则检查 UP-LEFT-DOWN-RIGHT,使用 8 个连接,您还检查对角线),直到完成该区域。为每个像素分配一个标签。增加标签计数器。
    3- 从您离开的地方继续扫描。

    【讨论】:

    • 为什么不炫耀你的结果呢?人们喜欢图文并茂的答案,而且它们易于理解和检查...
    • 对不起,我完全同意。按照您的建议附上示例图片。
    • 我非常了解代码,但我没有得到“connectedComponentsWithStats”函数的实际作用?
    • 它将二进制图像作为输入,并返回该图像中连接的像素组。如果您想自己实现该功能,天真的方法是: 1- 从左上角到右下角扫描图像像素,直到遇到没有标签(id)的非零像素。 2-当您遇到非零像素时,递归搜索其所有邻居(如果您使用 4 个连接,则检查 UP-LEFT-DOWN-RIGHT,使用 8 个连接,您还检查对角线),直到完成该区域。为每个像素分配一个标签。增加标签计数器。 3- 从您离开的地方继续扫描。
    • 还有没有一种方法可以围绕这些圆圈创建网格线,这样每个圆圈都应该在网格框内?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 2014-09-21
    • 1970-01-01
    • 2012-02-05
    • 2013-10-08
    • 1970-01-01
    • 2017-06-02
    相关资源
    最近更新 更多