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