根据颜色分割图像中的像素 (Matlab)

Segment pixels in an image based on colour (Matlab)

我正在尝试仅使用颜色信息(目前)对包含多个乐高积木的图像进行分割。目的是找到乐高积木,例如是绿色的。我曾尝试使用 k-means 聚类,但给定的不同颜色积木的数量各不相同。我还尝试使用 Matlab website

中的以下示例

但这并不成功。有没有简单的颜色分割方法?

问题的示例图像:

因此,仅根据颜色选择区域时,RGB 或 LAB 色彩空间并不是真正的最佳选择。更好的选择是 HSV (Hue-Saturation-Value)。在这里,我们可以定义什么色调范围定义 'green',饱和度参数定义什么是 'colored' 像素,以及最小区域大小。然后根据这些值进行一些阈值处理、一些形态学过滤以及在绘图之前返回的区域过滤。一贯的套路。

下面的代码检测您提供的图像中的绿色砖块。它不是很完美,因为相邻的砖块作为单个区域返回,但是您可以使用边缘过滤器在这些检测到的区域内进行一些更详尽的工作,例如,最终得到砖块数量的精确计数。

% 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