因此,在仅根据颜色选择区域时,RGB 或 LAB 颜色空间并不是最好的选择。更好的选择是 HSV(Hue-Saturation-Value)。在这里,我们可以定义定义“绿色”的色调范围、定义“彩色”像素的饱和度参数以及最小区域大小。然后基于这些值进行一些阈值化、一些形态学过滤以及在绘图之前对返回的区域进行过滤。例行公事。
下面的代码会检测您提供的图片中的绿砖。它不是很完美,因为相邻的砖块作为单个区域返回,但是您可以使用边缘过滤器在这些检测到的区域内做一些更详尽的工作,例如,最终精确计算砖块的数量。
% 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