Yani RGB veya LAB renk aralıkları gerçekten yalnız rengine göre bölgeleri seçerken kullanılacak en iyi olanlar değildir. Daha iyi seçim HSV (Ton-Doygunluk Değeri). Burada, "renk" pikseli neyin tanımlandığını tanımlamak için doygunluk için bir parametre olan 'yeşil', ve en küçük bölge büyüklüğünü tanımlayabiliriz. Daha sonra, bu değerlere dayanan bir miktar eşikleme, bazı morfolojik filtreleme ve çizimden önce geri dönen bölgelerin filtrelenmesi. Her zamanki rutin.
Aşağıdaki kod, sağladığınız görüntüdeki yeşil tuğlaları algılar. Bitişik olmayan tuğlalar tek bir bölge olarak geri döndüğü için bu mükemmel değildir, ancak tespit edilen bu bölgelerin içinde bir kenar filtresiyle daha ayrıntılı çalışmalar yapabilirsiniz, örneğin, tuğlaların sayısının kesin bir sayımı ile sonuçlanabilir.
% 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
farklı renk değişiklik olan Lego sayısı, bu sorun, biraz zor zor hale gelmiştir. Grafik tabanlı görüntü bölümlemesini [buradan] (http://cs.brown.edu/~pff/segment/) veya [buradan] deneyebilirsiniz (http://www.mathworks.com/matlabcentral/fileexchange/25866- verimli-grafik tabanlı görüntü bölümleme). K-araçlarına ilk sentroları atamadan önce bazı ön işlem yapmayı da düşünebilirsiniz. –
Benzer sorun [bu soru] olarak (http://stackoverflow.com/q/4063965/52738). Orada da bazı yararlı çerezler bulabilirsiniz. – gnovice