2012-04-07 227 views
5

如您所見,我有形狀和白色邊界。我想填充白色的形狀。Matlab填充白色形狀

輸入是: enter image description here

我想獲得這個輸出: http://s12.postimage.org/z3txnlb3f/untitled33.png

任何人可以幫助我,請與此代碼?它不會將黑色橢圓更改爲白色。 非常感謝:]

I = imread('untitled4.bmp'); 
Ibw = im2bw(I); 
CC = bwconncomp(Ibw); %Ibw is my binary image 
stats = regionprops(CC,'pixellist'); 

% pass all over the stats 
for i=1:length(stats), 
size = length(stats(i).PixelList); 
% check only the relevant stats (the black ellipses) 
if size >150 && size < 600 
    % fill the black pixel by white  
    x = round(mean(stats(i).PixelList(:,2))); 
    y = round(mean(stats(i).PixelList(:,1))); 
    Ibw = imfill(Ibw, [x, y]); 
end; 
end; 

imshow(Ibw); 
+0

相關的http://stackoverflow.com/questions/10053651/獲得像素屬於一個形狀 – Gray 2012-04-07 15:05:44

回答

1

如果您的圖像是全黑&白色,並且您有圖像處理工具箱,那麼這是不是您所需要的: http://www.mathworks.co.uk/help/toolbox/images/ref/imfill.html

喜歡的東西:

imfill(image, [startX, startY]) 

其中startX,startY是您要填充的區域中的像素。

+0

謝謝,但我怎麼能找到每個形狀的像素? – 2012-04-07 13:53:07

+0

您可以使用bwconncomp(http://www.mathworks.co.uk/help/toolbox/images/ref/bwconncomp.html)。如果你做了'c = bwconncomp(image)',那麼你可以用'c.PixelIdxList'查看組件。這些是圖像中的線性索引,告訴您哪些像素位於哪個組件中。您希望忽略一個組件(背景),您可以假設它是PixelIdxList中的最大列表,或者您可以查找包含邊緣像素的列表。從c中的其他組件中,您需要檢查它們是否是黑色的。如果是,請使用imfill。 – Richante 2012-04-07 14:34:24

+0

哦,我注意到你的圖片也有一個巨大的白色邊框。你也想忽略這個組件(所以可能忽略'PixelIdxList'中最大的兩個組件)。 – Richante 2012-04-07 14:39:11

3

您的代碼可以改進和簡化如下。首先,否定Ibw並使用BWCONNCOMP查找4連接的組件將爲您提供每個黑色區域的索引。其次,按照其中的像素數量對連通區域進行排序,然後選擇除最大兩個之外的所有區域,將爲您指定所有較小的圓形區域。最後,可以收集這些較小區域的線性指數並用其填充白色區域。下面的代碼(相當多短,不需要任何環路):

I = imread('untitled4.bmp'); 
Ibw = im2bw(I); 

CC = bwconncomp(~Ibw, 4); 
[~, sortIndex] = sort(cellfun('prodofsize', CC.PixelIdxList)); 

Ifilled = Ibw; 
Ifilled(vertcat(CC.PixelIdxList{sortIndex(1:end-2)})) = true; 
imshow(Ifilled); 

而這裏的結果圖像:

enter image description here

+0

嗨gnovice,謝謝你的幫助,它不工作,但Richante幫助我..謝謝:] – 2012-04-07 21:18:38