6

Sadece renkli bilgileri kullanarak birden çok lego tuğla içeren bir görüntüyü segmentlere ayırmaya çalışıyorum (şimdilik). Amaç, örn. Yeşiller. K-araçları kümelemeyi kullanmayı denedim, ancak verilen farklı renkli tuğlaların sayısı değişiyor. Ayrıca, aşağıdaki örneği Matlab websiteRenge göre görüntüyü piksellere ayırma (Matlab)

'dan kullanmayı denedim, ancak bu başarılı olmadı. Renk bazında basit bir bölümleme yolu var mı? sorun için

örnek bir resim:

enter image description here

+0

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. –

+0

Benzer sorun [bu soru] olarak (http://stackoverflow.com/q/4063965/52738). Orada da bazı yararlı çerezler bulabilirsiniz. – gnovice

cevap

8

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 

enter image description here

+0

Neat answer! __ –

+1

İkinci soru daha kolay bir sorudur. Ton aralıkları için bu gibi HSV değerlerini içeren bir renk seçim aracına bakın: http://hslpicker.com/#00ff6f. MATLAB için 0 ile 1 değil 0 ve 255 arasında ton değerine ihtiyacınız var. Veya yukarıdaki hsvImg matrisinin ilk dilimindeki değerlere bakın. – Staus

+0

Ne tür renklere karşılık geldiğini görmek için değerlerle uğraştım, ancak bu araç oldukça kullanışlı görünüyor! İlk sorudaki herhangi bir fikir var mı? – user3019612