2017-01-11 3 views
1

Ich habe ein Bild mit farbigen Bereichen (einige von ihnen mit der gleichen Farbe) und ich möchte, dass jede Region eine andere Farbe hat.Beschriftung Bildregionen

Ziel ist es, jede Region mit einer anderen Farbe/Beschriftung zu färben/beschriften.

Beispielbild:

enter image description here

+0

Hast du bei 'bwlabel' aussehen ? Möchten Sie auch eine MATLAB- oder Python-Lösung? Es gibt keine "Einheitsgröße". – Suever

+0

Ja, das Problem ist, dass in meinem Bild alle Regionen verbunden sind. bwlabel gibt eine Matrix zurück, die nur Einsen enthält. Eigentlich habe ich ein segmentiertes Bild, das mit zufälligen Werten beschriftet ist (einige von ihnen werden wiederholt) und ich möchte jedes Segment mit eindeutigen Labels beschriften. Es spielt keine Rolle, ob es sich um MATLAB, Python oder andere Lösungen handelt. – john518

+0

'bwlabel' gibt ** nicht ** eine Matrix zurück, die nur Einsen enthält. Sie enthält eine ganzzahlige Matrix von "0" bis "N", wobei "1, 2, ..., N" die Zugehörigkeit eines in einer Region enthaltenen Pixels bezeichnet. '0' ist der Hintergrund. Könnten Sie nicht einfach jedes einzelne Etikett durchlaufen und das Ergebnis einfärben? Ich kann eine Antwort geben, wenn Sie noch unklar sind. – rayryeng

Antwort

2

Sie dies durch Schleifen über die einzigartigen Werte in Ihrem Bild erreichen kann, eine Maske von der Schaffung Objekte mit diesem Wert und Ausführen von bwlabel für jede solche Maske. Dies wird Ihnen einzigartige Etiketten für jede angeschlossene Komponente in der Maske, und Sie können die Etiketten aus allen Masken sammeln, indem Sie die Anzahl der Etiketten bereits zuvor festgestellt:

img = imread('i5WLA.png'); 

index = zeros(size(img)); 
for iGray = unique(img(:)).' %' 
    mask = (img == iGray); 
    L = bwlabel(mask, 4); 
    index(mask) = L(mask)+max(index(:)); 
end 

subplot(2,1,1); 
imshow(img, []); 
title('Original'); 
subplot(2,1,2); 
imshow(index, []); 
title('Each region labeled uniquely'); 

Und hier ist die Handlung dies macht:

enter image description here

Sie können jetzt sehen, dass jedes verbundene Objekt seinen eigenen eindeutigen Grauwert hat. Sie können dann ein Farbbild von dieser neuen indexierten Bild erstellen entweder mit ind2rgb oder label2rgb und Auswahl eines colormap (hier verwende ich hsv) zu verwenden:

rgbImage = ind2rgb(index, hsv(max(index(:)))); 
imshow(rgbImage); 
% Or... 
rgbImage = label2rgb(index, @hsv); 
imshow(rgbImage); 

enter image description here

+0

Vielen Dank. Genau das brauche ich! – john518

0

Es sei denn, es gibt bereits eine Funktion um das Floating tut, was Sie wollen, können Sie immer schreiben Sie es selber.

Wenn ich dies tun müsste, würde ich so etwas wie einen union-find-Algorithmus betrachten, um alle gleichfarbigen angrenzenden/verbundenen Pixel in Mengen zu gruppieren und dann diesen Mengen Labels zuzuordnen.

Ein naiver (weniger effizient, aber nicht Vereinigungs-Suche erfordert) Implementierung mit Pseudo-Code:

# assume pixels are stored in numpy array. Use your imagination to adjust as required. 
put each pixel into its own set. 
for pixel in pixels: 
    neighbors = adjacent_same_color_pixels(pixel) 
    find the sets that contain pixel, and the sets that contain the neighbors 
    join all those sets together, delete the original sets 

now there's one set for each connected same-color shape. 
assign labels as desired. 
+0

MATLAB verfügt über mehrere integrierte Funktionen für die Bildbeschriftung/verbundene Komponenten/Segmentierung, so dass das Schreiben Ihrer eigenen wahrscheinlich übertrieben ist. – beaker

+0

Ja, ich wäre überrascht, wenn es nicht schon da wäre. Nur eine nette kleine Übung dann. – Lagerbaer

+0

Vielen Dank für Ihre Hilfe. Die akzeptierte Antwort bekommt, was ich brauche. – john518

Verwandte Themen