2012-04-07 18 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

उत्तर

1

अपनी छवियों को सभी काले & सफेद हैं, और आप छवि प्रसंस्करण टूलकिट है, तो इस तरह दिखता है कि तुम क्या जरूरत है: http://www.mathworks.co.uk/help/toolbox/images/ref/imfill.html

कुछ की तरह:

imfill(image, [startX, startY]) 

जहां startX, startY उस क्षेत्र में एक पिक्सेल है जिसे आप भरना चाहते हैं।

+0

धन्यवाद, लेकिन मैं प्रत्येक आकार के पिक्सल कैसे ढूंढ सकता हूं? –

+0

आप bwconncomp (http://www.mathworks.co.uk/help/toolbox/images/ref/bwconncomp.html) का उपयोग कर सकते हैं। यदि आप 'c = bwconncomp (image) 'जैसे कुछ करते हैं, तो आप' c.PixelIdxList' वाले घटक देख सकते हैं। ये छवि में रैखिक अनुक्रमणिका हैं, जो आपको बताते हैं कि कौन से पिक्सेल घटक हैं। आप एक घटक (पृष्ठभूमि) को अनदेखा करना चाहते हैं, जिसे आप बस PixelIdxList में सबसे बड़ी सूची मान सकते हैं, या आप एक सूची को देख सकते हैं जिसमें एज पिक्सेल है। सी में शेष घटकों से, आपको यह जांचना होगा कि वे काले हैं या नहीं। यदि वे हैं, तो उन पर imfill का उपयोग करें। – Richante

+0

ओह, मुझे लगता है कि आपकी छवि में एक विशाल सफेद सीमा भी है। आप उस घटक को भी अनदेखा करना चाहते हैं (इसलिए शायद 'पिक्सेलइडक्सलिस्ट' में सबसे बड़े दो घटकों को अनदेखा करें)। – Richante

3

आपका कोड निम्नानुसार बेहतर और सरल किया जा सकता है। सबसे पहले, Ibw को अस्वीकार करना और 4-कनेक्टेड घटकों को खोजने के लिए BWCONNCOMP का उपयोग करके आप प्रत्येक काले क्षेत्र के लिए सूचकांक देंगे। दूसरा, कनेक्टेड क्षेत्रों को पिक्सल की संख्या से क्रमबद्ध करना और सबसे बड़ा दो चुनने से आपको सभी छोटे परिपत्र क्षेत्रों के लिए सूचकांक मिलेंगे। अंत में, इन छोटे क्षेत्रों के रैखिक सूचकांक एकत्र किए जा सकते हैं और सफेद क्षेत्रों वाले क्षेत्रों को भरने के लिए उपयोग किए जा सकते हैं। यहाँ कोड (काफ़ी छोटे और की जरूरत नहीं किसी भी छोरों) है:

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, आपकी मदद के बारे में धन्यवाद, यह काम नहीं करता है लेकिन रिचांटे ने मेरी मदद की .. धन्यवाद:] –