擅长:python、mysql、java
<p>是的。在</p>
<ol>
<li>使用<code>ndimage.label</code>标记图像(首先反转图像,holes=black)。在</li>
<li>使用<code>ndimage.find_objects</code>查找孔对象切片</li>
<li>根据大小条件筛选对象切片列表</li>
<li>反转图像并对符合条件的切片执行<code>binary_fill_holes</code>。在</li>
</ol>
<p>这样就可以了,而不需要将图像切碎。例如:</p>
<p>输入图像:</p>
<p>{1美元^</p>
<p>输出图像(中等大小的孔消失):</p>
<p><img src="https://i.stack.imgur.com/lnAQd.jpg" alt="enter image description here"/></p>
<p>下面是代码(设置不等式以删除中等大小的blob):</p>
<pre><code>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
</code></pre>
<p>还需要注意的是,我必须增加切片的大小,这样孔就可以在所有的方向上都有边界。在</p>