1

我基本上有多个二进制图像,每个图像都包含一个连接组件。这些连通分量是从图像中检索出来的,这意味着如果将所有连通分量都绘制到一个图像文件中,则不会有空白区域,也不会有重叠的连通分量。我正在寻找一种从连接组件中提取边缘像素的快速方法。连接组件当前保存在单个图像中,其中位置 (x,y) 处的数字 i 对应于第 i 个连接组件。由于有很多连接的组件,最大数量在 400-2000 范围内,我正在寻找一种快速获取每个组件的边缘像素的方法。这是一张图片来说明我对算法的期望: 示例

我知道有一些边缘检测算法,但它们处理灰度图像,并且对于大量图像中的大图像中的小对象没有任何好处。有什么建议么?

4

1 回答 1

1

这可以更具体地使用形态学运算和最小/最大过滤器来解决。速度应该是可以接受的,因为整个图像只需要处理两次,而与组件的数量无关。

以下代码的最大部分仅用于生成示例图像。获取边界的相关线路如下所示:

# imports
import numpy as np
import scipy as sp
import scipy.ndimage

# size of test image
L=50    
# number of components
I=20    
# auxiliary array
array=np.zeros((I,L,L))

# for each component
for i in range(I):

    # draw random coordinates
    x,y=sp.random.randint(0,L,size=2)

    # set coordinate in auxiliary array to index of i-th component
    array[i,x,y]=i

    # create 'box' around coordinate
    array[i]=sp.ndimage.maximum_filter(array[i],size=20)

# create actual test image from auxiliary array
image=np.nanmax(array,axis=0)

# RELEVANT LINES: check if pixel belongs to border
imax=(sp.ndimage.maximum_filter(image,size=3)!=image)
imin=(sp.ndimage.minimum_filter(image,size=3)!=image)
icomb=np.logical_or(imax,imin)

# keep only pixels of original image at borders
edges=np.where(icomb,image,np.nan)

于 2017-08-24T14:42:40.067 回答