2017-01-28 8 views
1

私はBW2のオブジェクトを塗りつぶすようにしていますが、完全に白いイメージが得られています。なぜこうなった?Issue with imfill - Matlab

clc; 
clear; 
grayImage = rgb2gray(imread('https://i.stack.imgur.com/afCDL.jpg')); 

gaussian1 = fspecial('Gaussian', 15, 10); 
gaussian2 = fspecial('Gaussian', 15, 200); 
dog = gaussian1 - gaussian2; 
dogFilterImage = conv2(double(grayImage), dog, 'same'); 

I=im2uint8(dogFilterImage); 
T = adaptthresh(I, 0.4); 
BW = imbinarize(I,T); 

imshowpair(I, BW, 'montage') 

BW2 = bwareaopen(BW, 3000); 
BW2 = imfill(BW2,'holes'); 
imshow(BW2) 
title('Filled Image') 

答えて

1

問題がconv2あなたは畳み込みを実行するときに、あなたが'same'パラメータを使用しましたので、あなたのイメージの周りに「国境」を持っているとしている画像の上にゼロパディングを使用していることです。

enter image description here

このボーダーimfillは完全にあなたのイメージに記入させ、あなたの閾値化画像内のすべての1つのです。

1つのオプション

dogFilterImage = conv2(double(grayImage), dog, 'valid'); 

他のオプションが明示的にパッドイメージであることを畳み込みの前にゼロパディングされた画像によって影響を受ける任意の画素を省略れる代わりconv2'valid'入力を使用することであろうゼロ以外の値を使用します。 padarrayを使用してこれを行うことができます。

padded = padarray(double(grayImage), [8 8], 'replicate', 'both'); 
dogFilterImage = conv2(double(grayImage), dog, 'valid'); 

これらの方法のいずれかを使用して、出力は私が期待しているものと思われます。

enter image description here