2016-03-30 3 views
0

における関数imfill機能せず、二値画像を埋めますか?は<code>imfill</code>機能のない白い色で、この星の内部領域を埋めるためにどのような方法があります。この<a href="https://i.stack.imgur.com/AD9b8.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/AD9b8.png" alt="enter image description here"></a></p> <p>のような画像のためにMATLAB

+2

ます[flood-fill](https://en.wikipedia.org/wiki/Flood_fill)アルゴリズムを自分で実装することができます。これが 'imfill'関数の動作です。 – Amro

+0

ありがとう、私はまた、最初の白から最初の黒まで、ピクセルのシーケンスを白に塗りつぶすループについて約2つ考えました。それを行う他の方法はありますか? – Vlad

+0

ドキュメントを引用するには: 'BW2 = imfill(BW、 'holes')はバイナリイメージBWに穴を埋めます。この構文では、穴は、画像の端から背景を塗りつぶすことによって到達できない背景ピクセルのセットです。例えば:http://stackoverflow.com/a/1717015/97160 – Amro

答えて

0

私はあなたがほしいと思うものはPolygon Fillingです。しかし、ポイントとエッジをソートして、すべてを埋める必要があります。

他の簡単な解決策は、すべての黒色成分(Union-Findアルゴリズム)にラベルを付け、境界に触れないものに色を付けることです。

+0

@FiReRiRi、ありがとうございます! – Vlad

0

次の解決策は、あなたの星であるポリゴンの角を知ることに基づいています。その場合、poly2maskを使用して、星の内側(および境界線)に対応する塗りつぶしのピクセル(値1)と星の境界の外側の空のピクセル(値0)を持つ行列を生成できます。

など。

function filledStar = createFilledStar(boxSize) 

%// center star in box 
xCenter = boxSize/2; 
yCenter = xCenter; 

%// setup: star with random rotation 
angles = (rand + (0:1/10:1))*2*pi; %// polygon corners, angle 
rOuter = boxSize*0.5;    %// star outer radius 
rInner = boxSize*0.2;    %// star inner radius 

%// generate star polygon corner coordinates 
r = [repmat([rOuter rInner],1,5), rOuter]; 
x = xCenter + r.*cos(angles); 
y = yCenter - r.*sin(angles); 

%// convert polygon to 0-1 mask (as double) in box 
starMask = double(poly2mask(x, y, boxSize,boxSize)); 

%// (if you'd like to smooth edges), apply gaussian and return 
filledStar = imgaussfilt(starMask,1); 

end 

boxSize = 500; %// 500x500 pixels 
filledStar = createFilledStar(boxSize); 

imagesc(filledStar), colormap gray, axis equal 

enter image description here

0

として、あなたはこのコードを使用することができます事前に構築されたMATLAB関数を使用しない場合。境界であり、unfill垂直水平にし、「水平に見ることができない」という部分を星を埋める基本的にコードチェック

I = im2bw(imread('image.png')); 

hliml = zeros(1,size(I,1)); 
hlimr = zeros(1,size(I,1)); 
vliml = zeros(1,size(I,2)); 
vlimr = zeros(1,size(I,2)); 

for i = 1:size(I,1) 
    if ~isempty(find([diff(I(i,:)),0]==1,1,'first')) 
hliml(i) = find([diff(I(i,:)),0]==1,1,'first'); 
    end 
    if ~isempty(find([diff(I(i,:)),0]==-1,1,'last')) 
hlimr(i) = find([diff(I(i,:)),0]==-1,1,'last'); 
    end 
end 

for i = 1:size(I,2) 
    if ~isempty(find([diff(I(:,i));0]==1,1,'first')) 
vliml(i) = find([diff(I(:,i));0]==1,1,'first'); 
    end 
    if ~isempty(find([diff(I(:,i));0]==-1,1,'last')) 
vlimr(i) = find([diff(I(:,i));0]==-1,1,'last'); 
    end 
end 


for i = 1:size(I,1) 
    if hliml(i)~=0 
     I(i,hliml(i):hlimr(i)) = 1; 
    end 
end 

for i = 1:size(I,2) 
    if vliml(i)~=0 
     I(1:vliml(i),i) = 0; 
     I(vlimr(i):end,i) = 0; 
    end 
end 

imshow(I); 

塗りつぶし水平 step1

unfill垂直 step2

関連する問題

 関連する問題