Scipy Binary Closing - Edge Pixels失去价值

时间:2013-01-17 18:42:50

标签: python image image-processing numpy scipy

我试图在二进制图像中填充空洞。图像相当大,所以我把它分成几块进行处理。

当我使用scipy.ndimage.morphology.binary_fill_holes函数时,它会填充属于图像的较大孔。所以我尝试使用scipy.ndimage.morphology.binary_closing,它给出了在图像中填充小孔所需的结果。但是,当我将块重新组合在一起以创建整个图像时,我最终得到了接缝线,因为binary_closing函数会从每个块的边框像素中删除任何值。

有没有办法避免这种影响?

2 个答案:

答案 0 :(得分:4)

  1. 使用ndimage.label标记图像(首先反转图像,孔=黑色)。
  2. 使用ndimage.find_objects
  3. 查找孔对象切片
  4. 根据您的尺寸标准过滤对象切片列表
  5. 反转您的图片并在符合条件的切片上执行binary_fill_holes
  6. 应该这样做,而不需要砍掉图像。例如:

    输入图片:

    enter image description here

    输出图像(中间尺寸的孔已消失):

    enter image description here

    这是代码(不等式设置为删除中等大小的blob):

    import scipy
    from scipy import ndimage
    import numpy as np
    
    im = scipy.misc.imread('cheese.png',flatten=1)
    invert_im = np.where(im == 0, 1, 0)
    label_im, num = ndimage.label(invert_im)
    holes = ndimage.find_objects(label_im)
    small_holes = [hole for hole in holes if 500 < im[hole].size < 1000]
    for hole in small_holes:
        a,b,c,d =  (max(hole[0].start-1,0),
                    min(hole[0].stop+1,im.shape[0]-1),
                    max(hole[1].start-1,0),
                    min(hole[1].stop+1,im.shape[1]-1))
        im[a:b,c:d] = scipy.ndimage.morphology.binary_fill_holes(im[a:b,c:d]).astype(int)*255
    

    另请注意,我必须增加切片的大小,以便孔可以一直有边框。

答案 1 :(得分:1)

涉及来自邻近像素的信息(例如closing)的操作总是会出现问题。在你的情况下,这很容易解决:只处理略大于你的平铺的子图像,并在拼接时保持好的部分。