塗りつぶし操作
関数 imfill
はバイナリ イメージやグレースケール イメージ上で "塗りつぶし" 操作を実行します。この演算はイメージから人工的な部分を除去する場合に役立ちます。
バイナリ イメージの場合、
imfill
は連結した背景ピクセル (0
) を前景ピクセル (1
) に変化させ、オブジェクトの境界に達すると停止します。グレースケール イメージの場合、
imfill
は明るい領域で囲まれた暗い領域の強度値を周りのピクセルと同じレベルにまで高くします。このため、imfill
には、イメージの境界に接続していない局所的な最小値群を除去する効果があります。詳細については、Find Image Peaks and Valleysを参照してください。
連結性の指定
バイナリ イメージとグレースケール イメージの場合は、ユーザーが設定したピクセルの連結性により塗りつぶし操作の境界が決定されます。
メモ
imfill
は、"背景" ピクセルを操作するという点が、他のオブジェクトベースの操作と異なります。imfill
で連結性を設定する場合は、背景の連結性を設定することになります。前景の連結性ではありません。
次の図は、連結性の意味を示しています。
BW = logical([0 0 0 0 0 0 0 0; 0 1 1 1 1 1 0 0; 0 1 0 0 0 1 0 0; 0 1 0 0 0 1 0 0; 0 1 0 0 0 1 0 0; 0 1 1 1 1 0 0 0; 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0]);
背景が 4 連結の場合、このバイナリ イメージは 2 つの別々な背景要素 (ループの内側の部分と外側の部分) を含んでいます。背景が 8 連結の場合、ピクセルは対角的に連結し、背景要素は 1 つしかありません。
開始点の設定
バイナリ イメージの場合は、位置の添字を渡すか、対話モードで関数 imfill
を使用し、マウスで開始ピクセルを選択することで、塗りつぶし操作の開始点を指定できます。
たとえば、imfill
を呼び出し、ピクセル BW(4,3)
を開始点として設定すると、既定の設定では、背景は 4 連結であるため、imfill
はループの内側を塗りつぶします。
imfill(BW,[4 3])
ans = 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
同じ開始点を指定して 8 連結の背景連結を使用すると、imfill
はイメージ全体を塗りつぶします。
imfill(BW,[4 3],8)
ans = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
穴の塗りつぶし
塗りつぶし操作は、イメージ内の穴の塗りつぶしに使用するのが一般的です。たとえば、前景オブジェクトが球面を表すバイナリ、またはグレースケールのイメージを考えてみましょう。イメージの中で、これらのオブジェクトは円板状に見えるはずですが、元の写真の反射のためにドーナツ状に見えます。イメージのさらなる処理を行う前に、関数 imfill
を使用して "ドーナツの穴" を塗りつぶします。
穴の塗りつぶしに塗りつぶし操作を使用することはよくあるため、imfill
にはバイナリ イメージやグレースケール イメージ用にそれをサポートする特殊な構文が用意されています。この構文では引数 'holes'
を指定します。各穴でスタート位置を指定する必要はありません。
これを示すため、この例では脊柱のグレースケール イメージでの穴の塗りつぶしを行います。
[X,map] = imread('spine.tif'); I = ind2gray(X,map); Ifill = imfill(I,'holes'); figure montage({I,Ifill})