Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于颜色的图像像素分割(Matlab)_Matlab_Image Processing_Computer Vision_Image Segmentation - Fatal编程技术网

基于颜色的图像像素分割(Matlab)

基于颜色的图像像素分割(Matlab),matlab,image-processing,computer-vision,image-segmentation,Matlab,Image Processing,Computer Vision,Image Segmentation,我正在尝试只使用颜色信息分割包含多个乐高积木的图像(目前)。目的是寻找绿色的乐高积木。我尝试过使用k-means聚类,但是在一个给定的区域中,不同颜色的砖块的数量是不同的。我还尝试使用Matlab中的以下示例 但这并不成功。有没有一种基于颜色的简单分割方法 此问题的示例图像: 因此,仅基于颜色选择区域时,RGB或LAB颜色空间并不是最好的选择。更好的选择是HSV(色调饱和度值)。在这里,我们可以定义什么色调范围定义“绿色”,饱和度参数定义什么是“彩色”像素,以及最小区域大小。然后根据这些值进行阈

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

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

此问题的示例图像:


因此,仅基于颜色选择区域时,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
%输入图像
img=imread('http://i.stack.imgur.com/HSYc1.jpg');
绿色范围=[0.40.5];%视为“绿色”的色调值范围
minSat=0.5;%排除bkgd噪声的“彩色”像素的最小饱和度值
minRegionsize=500;%单个块的最小大小
%%%%%%%%%%%%%%%%%%%
%高斯模糊去噪
imgfilt=imfilter(img,fspecial('gaussian',10,2));
%将图像转换为HSV格式
hsvImg=rgb2hsv(imgfilt);
%阈值色调,仅获取绿色像素,仅获取彩色像素的饱和度
%像素
greenBin=hsvImg(:,:,1)>greenRange(1)和hsvImg(:,:,1)minSat;
greenBin=bwmorph(greenBin,'close');%形态学关闭来处理一些噪声阈值
%使用regionprops根据面积过滤,返回绿色块的位置
regs=regionprops(greenBin,'Area','Centroid','BoundingBox');
%删除每个小于minRegionSize的区域
注册表(垂直目录(注册表区域)

由于不同颜色的乐高积木的数量不同,这个问题变得有点困难。您可以尝试从或中进行基于图形的图像分割。在将初始质心分配给K均值之前,你也可以考虑做一些预处理。你也可以在那里找到一些有用的花边新闻。第二个问题比较简单。对于色调范围,请查看包含HSV值的颜色选择工具,如下所示:。但是,对于MATLAB,色调值需要介于0和1之间,而不是介于0和255之间。或者看看上面hsvImg矩阵第一部分中的值。我对这些值进行了一些处理,看看它们对应什么颜色,但是这个工具看起来非常有用!对第一个问题有什么想法吗?红色的值约为0,蓝色的值约为0.33,绿色的值约为0.67,但这些是R、G或B值。“绿色”砖的青色比纯绿色多,因此这些砖的色调值偏向蓝色。但实际上,我查看了hsvImg的第一个切片中的值并进行了估计。使用最小区域大小将删除检测到的较小区域,但这并不一定对应于较大的块。由于光线非常不均匀,砖块的阈值没有清理干净。看看上面的格林宾,看看它有多凌乱。玩色调和饱和度阈值和模糊过滤器可能会有帮助,但我不希望它永远完美。给你的建议。您可以直接使用
BoundingBox
属性进入
rectangle
函数,该函数直接接受四元素数组作为输入。绘制矩形时,无需沿每一侧复制点。使用
rectangle
可以更轻松地绘制矩形。