6

バイナリ イメージの穴を埋めようとしています。画像はかなり大きいので、処理のためにチャンクに分割しました。

関数を使用するscipy.ndimage.morphology.binary_fill_holesと、画像にある大きな穴が埋められます。そこでscipy.ndimage.morphology.binary_closing、画像の小さな穴を埋めるという望ましい結果が得られた を使用してみました。ただし、チャンクを元に戻して画像全体を作成すると、binary_closing関数が各チャンクの境界ピクセルから値を削除するため、シームラインができてしまいます。

この影響を回避する方法はありますか?

4

2 に答える 2

6

はい。

  1. を使用して画像にラベルを付けますndimage.label(最初に画像を反転させます。holes=black)。
  2. で穴オブジェクトのスライスを見つけますndimage.find_objects
  3. サイズ基準に基づいてオブジェクト スライスのリストをフィルタリングします
  4. 画像を反転し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

また、スライスのサイズを大きくして、穴の周りに境界線ができるようにする必要があることにも注意してください。

于 2013-01-17T18:59:30.550 に答える
1

closing常にエッジで問題が発生するような、隣接するピクセルからの情報を含む操作。あなたの場合、これは非常に簡単に回避できます。タイリングよりもわずかに大きいサブイメージを処理し、つなぎ合わせるときに適切な部分を保持するだけです。

于 2013-01-17T18:59:04.270 に答える