6

Ich versuche, ein Bild mit mehreren Legosteinen nur mit Farbinformationen zu segmentieren (vorerst). Das Ziel ist, Legosteine ​​zu finden, die z.B. sind grün. Ich habe versucht, k-means-Clustering zu verwenden, aber die Anzahl der verschiedenen farbigen Steine, die in einem gegebenen vorhanden sind, variiert. Ich habe auch versucht, das folgende Beispiel aus dem MatlabSegment Pixel in einem Bild basierend auf Farbe (Matlab)

, aber das war nicht erfolgreich. Gibt es eine einfache Art der Segmentierung basierend auf Farbe?

Ein Beispiel für das Problem:

enter image description here

+0

Da die Anzahl der Legosteine ​​mit unterschiedlichen Farben variieren, dieses Problem ein wenig schwierig wird. Sie können eine bildbasierte Bildsegmentierung von [hier] (http://cs.brown.edu/~pff/segment/) oder [hier] versuchen (http://www.mathworks.com/matlabcentral/fileexchange/25866- effiziente Graph-basierte Bildsegmentierung). Sie können auch eine Vorverarbeitung vornehmen, bevor Sie k-means initiale Schwerpunkte zuweisen. –

+0

Ähnliches Problem wie [diese Frage] (http://stackoverflow.com/q/4063965/52738). Sie können dort auch einige nützliche Leckerbissen finden. – gnovice

Antwort

8

So RGB oder LAB-Farbräume sind nicht wirklich die besten sind zu verwenden, wenn Regionen allein basieren auf Farbe wählen. Die bessere Wahl ist HSV (Farbton-Sättigungs-Wert). Hier können wir definieren, welche Farbtonbereiche 'grün' definieren, einen Parameter für die Sättigung, um zu definieren, was ein 'farbiges' Pixel ist, und eine minimale Bereichsgröße. Dann einige Schwellenwerte basierend auf diesen Werten, einige morphologische Filterung und Filterung der Bereiche, die vor dem Plotten zurückgegeben werden. Die übliche Routine.

Der folgende Code erkennt die grünen Steine ​​in Ihrem bereitgestellten Bild. Es ist nicht ganz perfekt, weil benachbarte Steine ​​als eine einzelne Region zurückgegeben werden, aber Sie können innerhalb dieser erkannten Regionen mit einem Kantenfilter zum Beispiel eine ausführlichere Arbeit leisten, um mit einer genauen Zählung der Anzahl der Steine ​​zu enden.

% Input image 
img = imread('http://i.stack.imgur.com/HSYc1.jpg'); 

greenRange = [0.4 0.5]; % Range of hue values considered 'green' 
minSat = 0.5; % Minimum saturation value for 'colored' pixels to exclude bkgd noise 
minRegionsize = 500; % Min size for a single block 

%%%%%%%%%%%%%%%%%%% 
% Denoise with a gaussian blur 
imgfilt = imfilter(img, fspecial('gaussian', 10, 2)); 
% Convert image to HSV format 
hsvImg = rgb2hsv(imgfilt); 

% Threshold hue to get only green pixels and saturation for only colored 
% pixels 
greenBin = hsvImg(:,:,1) > greenRange(1) & hsvImg(:,:,1) < greenRange(2) & hsvImg(:,:,2) > minSat; 
greenBin = bwmorph(greenBin, 'close'); % Morphological closing to take care of some of the noisy thresholding 

% Use regionprops to filter based on area, return location of green blocks 
regs = regionprops(greenBin, 'Area', 'Centroid', 'BoundingBox'); 
% Remove every region smaller than minRegionSize 
regs(vertcat(regs.Area) < minRegionsize) = []; 

% Display image with bounding boxes overlaid 
figure() 
image(img); 
axis image 
hold on 
for k = 1:length(regs) 
    plot(regs(k).Centroid(1), regs(k).Centroid(2), 'cx'); 

    boundBox = repmat(regs(k).BoundingBox(1:2), 5, 1) + ... 
     [0 0; ... 
     regs(k).BoundingBox(3) 0;... 
     regs(k).BoundingBox(3) regs(k).BoundingBox(4);... 
     0 regs(k).BoundingBox(4);... 
     0 0];  
    plot(boundBox(:,1), boundBox(:,2), 'r'); 
end 
hold off 

enter image description here

+0

Richtige Antwort! __ –

+1

Zweite Frage ist einfacher. Für Farbtonbereiche schauen Sie sich ein Farbauswahlwerkzeug an, das HSV-Werte wie diesen enthält: http://hslpicker.com/#00ff6f. Für MATLAB benötigen Sie jedoch den Farbtonwert zwischen 0 und 1, nicht 0 und 255. Oder sehen Sie sich die Werte im ersten Teil der obigen hsvImg-Matrix an. – Staus

+0

Ich habe mit den Werten herumgespielt, um zu sehen, welchen Farben sie entsprechen, aber dieses Werkzeug sieht sehr nützlich aus! Irgendwelche Ideen zur ersten Frage? – user3019612

Verwandte Themen