はい。
- を使用して画像にラベルを付けます
ndimage.label
(最初に画像を反転させます。holes=black)。
- で穴オブジェクトのスライスを見つけます
ndimage.find_objects
- サイズ基準に基づいてオブジェクト スライスのリストをフィルタリングします
- 画像を反転し
binary_fill_holes
、基準を満たすスライスで実行します。
画像を切り刻む必要なく、それで十分です。例えば:
入力画像:
出力イメージ (中サイズの穴がなくなっています):
コードは次のとおりです (中間サイズのブロブを削除するように不等式が設定されています)。
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
また、スライスのサイズを大きくして、穴の周りに境界線ができるようにする必要があることにも注意してください。