【问题标题】:Segment pixels in an image based on colour (Matlab)基于颜色分割图像中的像素(Matlab)
【发布时间】:2015-01-17 21:19:11
【问题描述】:

我正在尝试仅使用颜色信息来分割包含多个乐高积木的图像(目前)。目的是找到乐高积木,例如是绿色的。我尝试过使用 k-means 聚类,但是给定的不同颜色的砖块的数量会有所不同。我还尝试使用 Matlab 中的以下示例website

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

问题的示例图片:

【问题讨论】:

  • 由于不同颜色的乐高积木的数量不同,这个问题变得有点困难。您可以从herehere 尝试基于图形的图像分割。您还可以考虑在将初始质心分配给 k-means 之前进行一些预处理。
  • this question 类似的问题。你也可以在那里找到一些有用的花絮。

标签: matlab image-processing computer-vision image-segmentation


【解决方案1】:

因此,在仅根据颜色选择区域时,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

【讨论】:

  • 第二个问题比较简单。对于色调范围,请查看包含 HSV 值的颜色选择工具,例如:hslpicker.com/#00ff6f。不过,对于 MATLAB,您需要介于 0 和 1 之间的色调值,而不是 0 和 255。或者查看上面 hsvImg 矩阵第一个切片中的值。
  • 我有点玩弄这些值以查看它们对应的颜色,但该工具看起来非常有用!关于第一个问题的任何想法?
  • 红色的值约为 0,蓝色的值约为 0.33,绿色的值约为 0.67,但这些值用于 R、G 或 B 值。 “绿色”砖比纯绿色更青色,因此它们的色调值偏向蓝色。但实际上我查看了 hsvImg 的第一部分中的值并进行了估计。
  • 使用最小区域大小将删除检测到的较小区域,但这不一定对应于较大的砖块。由于照明非常不均匀,砖块没有干净的阈值。看看上面的greenBin,看看它有多乱。使用色调和饱和度阈值以及模糊滤镜可能会有所帮助,但我不希望它永远完美。
  • 给你的建议。您可以将BoundingBox 属性直接使用到rectangle 函数中,该函数直接接受四元素数组作为输入。无需复制每一边的点来绘制矩形。使用rectangle 可以更轻松地绘制矩形。
猜你喜欢
  • 2017-07-24
  • 2014-10-30
  • 2014-01-16
  • 2013-09-29
  • 2020-05-19
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多