我试图仅使用颜色信息(目前)分割包含多个乐高积木的图像。目的是找到乐高积木,例如是绿色的。我尝试过使用k-means聚类,但是给定的不同颜色砖的数量会有所不同。我也尝试使用Matlab website
中的以下示例但这并不成功。有没有一种基于颜色的简单分割方法?
问题的示例图片:
答案 0 :(得分:9)
因此,在仅根据颜色选择区域时,RGB或LAB颜色空间并不是最佳选择。更好的选择是HSV(色调饱和度 - 值)。在这里,我们可以定义什么色调范围定义'绿色',饱和度的参数定义什么是'彩色'像素,以及最小区域大小。然后根据这些值进行一些阈值处理,一些形态滤波,以及在绘图之前返回的区域的过滤。通常的例程。
以下代码会检测您提供的图片中的绿砖。它并不完美,因为相邻的砖块作为单个区域返回,但是您可以使用边缘过滤器在这些检测到的区域内进行更详尽的工作,例如,最终得到砖块数量的精确计数。
% 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