6

मैं मुसीबत ग्रेस्केल छवि के सही विभाजन को प्राप्त हो रहा है के आधार पर विभाजित:ग्रेस्केल छवि

:

Image to be segmented

जमीनी सच्चाई, यानी मैं विभाजन की तरह लग रहे करना चाहते हैं, यह वह जगह है

Ground truth

मुझे सर्कल के भीतर तीन घटकों में सबसे अधिक दिलचस्पी है। इस प्रकार, जैसा कि आप देख सकते हैं, मैं शीर्ष छवि को तीन घटकों में विभाजित करना चाहता हूं: दो सेमी-सर्कल, और उनके बीच एक आयताकार।

मैंने पतला, क्षरण, और पुनर्निर्माण के विभिन्न संयोजनों के साथ-साथ विभिन्न क्लस्टरिंग एल्गोरिदम, के-साधन, आइसोडाटा और गॉसियन के मिश्रण सहित सभी प्रयासों की कोशिश की है - सभी सफलता की विभिन्न डिग्री के साथ।

किसी भी सुझाव की सराहना की जाएगी।

संपादित करें: यहां सबसे अच्छा परिणाम है जिसे मैं प्राप्त करने में सक्षम हूं। यह परिपत्र आरओआई खंड के लिए एक सक्रिय समोच्च isodata क्लस्टरिंग का उपयोग कर, और फिर लागू करने के प्राप्त हुई थी:

Clusters

इस के साथ दो समस्याएं हैं:

  • निचले दाएं क्लस्टर के आसपास सफेद प्रभामंडल , शीर्ष बाएं क्लस्टर से संबंधित
  • केंद्र क्लस्टर से संबंधित शीर्ष-दाएं और नीचे-बाएं क्लस्टर दोनों के चारों ओर भूरे रंग के हेलो।
+0

यह आप की तरह लग रहा त्रिकोणीय मोडल हिस्टोग्राम की है। Dsp.stackexchange.com पर मेरा उत्तर देखें -> http://dsp.stackexchange.com/questions/3643/image-segmentation-issue-of-different-materials/3650#3650। किसी भी मामले में, आपका प्रश्न उस साइट पर ले जाया जाना चाहिए। –

+0

मैंने हिस्टोग्राम-आधारित विभाजन की कोशिश की है। इस दृष्टिकोण के साथ समस्या यह है कि दाएं-अधिकांश क्लस्टर के आस-पास पिक्सेल के मान बाएं-अधिकांश क्लस्टर के पिक्सेल के समान होते हैं, जिसके परिणामस्वरूप दाएं-अधिकांश क्लस्टर के आसपास "हेलो" होता है। – Richard

+0

क्या आपने bwboundaries, या bwlabel की कोशिश की है? वे आपके लिए काम कर सकते हैं। लेकिन अगर हेलो प्रभाव बहुत अधिक है, तो हो सकता है कि आपको नतीजे न मिले। फिर भी, पहले और बाद में कुछ हेरफेर और सफाई के साथ, आप जो चाहते हैं उसे प्राप्त कर सकते हैं। यह [हौ सर्कल] जैसे कुछ भी उपयोग करने में मदद कर सकता है (http://www.mathworks.com/matlabcentral/fileexchange/26978-hough-transform-for-circles/content/html/circle_houghdemo.html), या अन्य विधियां जैसे [यह एक] (http: //blogs.mathworks।कॉम/पिक/2008/05/23/पता लगाने-सर्किल-इन-ए-इमेज /), ताकि आप अपने सर्कल की सीमाएं जान सकें। – Bill

उत्तर

7

यहां स्टार्टर है ... सर्कुलर भाग को खोजने के लिए circular Hough transform का उपयोग करें। इसके लिए मैं शुरुआत में threshold the image locally

im=rgb2gray(imread('Ly7C8.png')); 
imbw = thresholdLocally(im,[2 2]); % thresold localy with a 2x2 window 
% preparing to find the circle 
props = regionprops(imbw,'Area','PixelIdxList','MajorAxisLength','MinorAxisLength'); 
[~,indexOfMax] = max([props.Area]); 
approximateRadius = props(indexOfMax).MajorAxisLength/2; 
radius=round(approximateRadius);%-1:approximateRadius+1); 
%find the circle using Hough trans. 
h = circle_hough(edge(imbw), radius,'same'); 
[~,maxIndex] = max(h(:)); 
[i,j,k] = ind2sub(size(h), maxIndex); 
center.x = j;  center.y = i; 

figure;imagesc(im);imellipse(gca,[center.x-radius center.y-radius 2*radius 2*radius]); 
title('Finding the circle using Hough Trans.'); 

enter image description here

चयन केवल क्या वृत्त के भीतर है:

[y,x] = meshgrid(1:size(im,2),1:size(im,1)); 
z = (x-j).^2+(y-i).^2; 
f = (z<=radius^2); 
im=im.*uint8(f); 

संपादित करें: एक जगह को देखकर सीमा यह क्षेत्र के लिए छवि शुरू करने के लिए

नज़र हिस्टोग्राम, यह पहली स्थानीय अधिकतमता ढूंढ रहा है, और वहां से दो अलग-अलग सेगमेंट तक, तब तक पुन: उपयोग कर रहा है bwlabel:

p=hist(im(im>0),1:255); 
    p=smooth(p,5); 
    [pks,locs] = findpeaks(p); 

    bw=bwlabel(im>locs(1)); 
    i=0; 
    while numel(unique(bw))<3 
    bw=bwlabel(im>locs(1)+i); 
    i=i+1; 
    end 


imagesc(bw); 

enter image description here

मध्य भाग अब चक्र से दो लेबल भागों बाहर लेने के द्वारा प्राप्त किया जा सकता है, और क्या मध्य हिस्सा होगा छोड़ दिया है (+ प्रभामंडल से कुछ)

bw2=(bw<1.*f); 

लेकिन कुछ मंझला छानने के बाद हम और अधिक reasonble कुछ पाने

bw2= medfilt2(medfilt2(bw2)); 

और एक साथ हम पाते हैं:

imagesc(bw+3*bw2); 

enter image description here

अंतिम भाग एक असली "त्वरित और गंदी", मुझे यकीन है कि उपकरणों के साथ आप पहले से ही इस्तेमाल किया आप बेहतर परिणाम मिल जाएगा है ...

+0

बहुत अच्छा, इस के साथ आने के लिए समय लेने के लिए धन्यवाद। हालांकि, परिणाम इस मामले में 186 में थ्रेसहोल्ड वैल्यू पर भारी निर्भर करता है। उदाहरण के लिए, 183 का मूल्य परिणाम को काफी विकृत करता है। मुझे एहसास है कि मैंने इसे अपने प्रश्न में निर्दिष्ट नहीं किया है, लेकिन यह समस्या का केवल एक विशिष्ट उदाहरण है; ऐसी कई अन्य छवियां हैं जिन्हें समान विभाजन की आवश्यकता होती है। इसलिए, मैं एक स्वचालित, सामान्य समाधान के साथ आने की उम्मीद कर रहा था। शायद थ्रेसहोल्ड पैरामीटर "अनुमान" करने का कोई तरीका है। – Richard

+0

ऐसा करने के कई तरीके हैं, मेरे संपादन को तुरंत एक थ्रेसहोल्ड सेट करने के लिए एक गंदे तरीके से देखने के लिए देखें जो मेरे पहले से बहुत दूर नहीं था ... – bla

1

कोई भी watershed transformation का उपयोग करके अनुमानित परिणाम प्राप्त कर सकता है।

enter image description here

एक और सरल विधि एक डिस्क संरचना तत्व के साथ मूल छवि पर एक रूपात्मक समापन प्रदर्शन करने के लिए है (: - यह उलटा छवि पर वाटरशेड है> जल (255 I) यहाँ एक उदाहरण परिणाम है कोई granulometries के लिए multiscale बंद कर सकते हैं) और फिर पूर्ण सर्कल प्राप्त करें। सर्कल निकालने के बाद और घटक घटाना आसान है।

se = strel('disk',3); 
Iclo = imclose(I, se);% This closes open circular cells. 
Ithresh = Iclo>170;% one can locate this threshold automatically by histogram modes (if you know apriori your cell structure.) 
Icircle = bwareaopen(Ithresh, 50); %to remove small noise components in the bg 

enter image description here

Ithresh2 = I>185; % This again needs a simple histogram. 

enter image description here

संबंधित मुद्दे