2017-02-22 3 views
0

Ich habe ein Bild, in dem ich seine Kanten glätten möchte. Es war eine kleine Herausforderung, eine genauere Segmentierung zu erreichen. Ich habe jedoch eine Lösung gefunden, indem ich den Vorschlag von What can I do to enhance my image quality? angepasst habe.Wie glätte ich die Kanten eines Mehrkomponentenbildes?

Die Originalbilder ist hier: Original image

und segmentierte Bild als auch Segmented image

Der i-Code verwendet wird, ist wie folgt:

%# Read in image 
Img = imread('image_name.png'); 

%# Apply filter 
h = fspecial('average'); 
Img = imfilter(Img, h); 

%# Segment image 
Img = rgb2gray(Img); 
thresh = multithresh(Img, 2); 
Iseg = imquantize(Img, thresh);  
figure, imshow(Iseg,[]), title('Segmented Image'); 

%# separate channels 
blackPixels = (Iseg == 1); 
grayPixels = (Iseg == 2); 
whitePixels = (Iseg == 3); 


%# grow white channel 
whitePixels_dilated = imdilate(whitePixels, strel('disk', 4, 4)); 

%# Add all channels 
Iseg(whitePixels | whitePixels_dilated) = 3;    
figure, imshow(Iseg,[]); 

Meine Herausforderung das glätten ist gerade jetzt Kanten des Volumenkörpers (whitePixels) oder die Kanten aller Objekte. Ich habe keine Ahnung, wie ich das machen soll. Ich habe versucht zu filtern, aber das nimmt nur die kleinen Flecken. Bitte jede Hilfe, Ideen, Anregungen oder Ratschläge werden sehr geschätzt. Vielen Dank.

+0

Welche Art von Filterung haben Sie versucht? – Max

+0

Wenn Sie die Kanten glätten, wird es kein segmentiertes (indiziertes) Bild mehr sein. Ist es das was du willst? – beaker

+0

@ user2201 Anstatt die Kanten zu glätten, sollten Sie versuchen, einen Kreis-Algorithmus auf Ihr indiziertes Bild anzuwenden. Dann können Sie die Kreise, die Sie über Ihr indiziertes Bild gefunden haben, mit einer etwas dickeren 'LineWidth' plotten, und Sie erhalten schärfere Konturen auf Ihren Kreisen. Und dann - abhängig von der Genauigkeit, die Sie benötigen - können Sie die Pixel im Kreis als entweder innerhalb oder außerhalb des Segments indizieren. – Max

Antwort

0

Ich würde vorschlagen, einen rechteckigen Filter mehrmals anzuwenden. Hier ist ein Ansatz, wie dies zu tun:

I=imread('Orl1r.png'); 
I_gray=rgb2gray(I); 
I_filtered=I_gray; % initialize the filtered image 
for ii=1:10 
    I_filtered=imfilter(I_filtered,1/25*ones(5)); % apply rectangular-filter multiple times 
end 
figure 
subplot(1,2,1) 
imshow(I,[0 255]); 
subplot(1,2,2); 
imshow(I_filtered,[0 255]) 

Hier ist, was das gefilterte Bild aussehen würde: enter image description here

Hoffnung, das hilft.

BEARBEITEN: Anstelle des Rechteckfilters können Sie auch einen Gaußschen Filter verwenden. Aber die allgemeine Idee, mehrere Male anzuwenden, bleibt bestehen. Sie können einen Gauß-Filter für exapmle erstellen, indem Sie f=fspecial('gaussian',5,6) verwenden, wodurch eine 5x5 Filtermaske mit Sigma = 6 erstellt wird.

+0

Ich erkenne, dass ** beaker ** darauf hinwies, dass dies kein indiziertes Bild mehr sein wird, obwohl mit Medianfilter die Kanten nicht geglättet werden, sondern die Labels und einige der winzigen Flecken unten links bleiben Ecke werden ebenfalls entfernt. Trotzdem, vielen Dank für diesen Vorschlag habe ich etwas daraus gelernt, zumal ich das entstandene Bild für Visualisierungszwecke nutzen konnte. – User2201

+0

@ User2201 Nun, der Median-Filter ist nicht gemacht, um Bilder zu glätten. Der Median-Filter wurde entwickelt, um das sogenannte Salz-und-Rauschen-Rauschen zu entfernen. Selbst wenn man es mehrmals anwendet, werden die Ränder des Bildes nicht geglättet, was eigentlich das Gute daran ist. Ich bin froh, dass ich trotzdem helfen konnte und viel Glück mit Ihrem Projekt. – Max

+0

Vielen Dank @Max – User2201

Verwandte Themen