8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何使用 OpenCV 连接图像中的边缘?

ryandra 2月前

177 0

我有一张二进制图像,其中包含一些矩形形状,其中只有边缘完全可见。我想连接缺失的线条并制作完整的矩形。如何使用 Open... 实现此目的

我有一张二值图像,其中包含一些矩形形状,其中只有边缘完全可见。我想连接缺失的线条并制作完整的矩形。如何使用 OpenCV 实现这一点。

source image

我的目标结果如下:

帖子版权声明 1、本帖标题:如何使用 OpenCV 连接图像中的边缘?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由ryandra在本站《opencv》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 也许你可以尝试使用连通分量来分析每个模式的结构。像这样:

    from skimage import measure, filters
    import numpy as np
    
    # segments by connected components
    segmentation = measure.label(closing)
    
    # finds areas of each connected component, omits background
    areas = np.bincount(segmentation.ravel())[1:]
    # finds threhsold to remove small components
    t = filters.threshold_otsu(areas)
    # finds connected component indexes, which areas greater than the threshold
    indexes = np.where(areas > t)[0] + 1
    # filters out small components
    dominant_patterns = np.isin(segmentation, indexes) 
    
    # this is applicable if the image well centered
    # forehead center is approximately positioned at image center
    # flip image by columns
    dominant_patterns_flipped = np.flip(dominant_patterns, axis=1)
    # finds intersection with flipped image
    omega_like = dominant_patterns * dominant_patterns_flipped
    

    注意:如果图像居中,即前额位于图像的中心,则适用此方法,并且假设存在垂直对称。

    这将给你以下图像:

    enter image description here

    现在我们可以按行和列对图像进行分析,以计算每行和每列的像素出现次数,使用以下函数:

    import numpy as np
    
    def row_col_profiles(image):
        """
        Returns pixels occurances per row and column
        """
        rows, cols = np.indices((image.shape))
        
        row_lengths = np.bincount(rows.ravel())
        number_of_pixels_on_each_row = np.bincount(rows.ravel(), image.ravel())
        row_profile = number_of_pixels_on_each_row / row_lengths
    
        col_lengths = np.bincount(cols.ravel())
        number_of_pixels_on_each_col = np.bincount(cols.ravel(), image.ravel())
        col_profile = number_of_pixels_on_each_col / col_lengths
    
        return row_profile, col_profile
    
    row_profile, col_profile = row_col_profiles(omega_like)
    

    您可以绘制如下轮廓图:

    import matplotlib.pyplot as plt
    
    fig, axes = plt.subplots(1,2, figsize=(10, 5))
    axes[0].plot(row_profile)
    axes[0].set_title("Horizontal Line Profile")
    axes[0].set_xlabel("Row Index")
    axes[0].set_ylabel("Bright Pixel Occurance")
    axes[0].grid()
    axes[1].plot(col_profile)
    axes[1].set_title("Vertical Line Profile")
    axes[1].set_xlabel("Column Index")
    axes[1].set_ylabel("Bright Pixel Occurance")
    axes[1].grid()
    

    你会得到类似这样的结果:

    为了检查我们是否有类似欧米茄的模式,我们可以从该配置文件中获取一些阈值,例如 0.2,并且检查至少我们在垂直配置文件中是否有 2 个相对相同水平的峰值(我使用了最大值的 -10%)。

    is_omega_like = row_profile.max()>=0.2 and col_profile.max()>=0.2 and len(np.where(col_profile>col_profile.max()*0.9)[0])>=2
    

    您还可以尝试测量一些属性,并在连通分量上找到一些合理的阈值。请查看 文档 .

返回
作者最近主题: