从图像和分割对象中消除各种背景?

时间:2014-11-09 18:51:17

标签: image-processing matlab matlab-cvst

假设我有这个输入图像,有任意数量的框。我想分割出这些盒子,所以我最终可以将它们摘出来。 输入图像:

背景可以是连续的任何东西,如彩绘墙,木桌,地毯。 我的想法是渐变在整个背景中是相同的,并且具有恒定的梯度。我可以将渐变大致相同的地方转换为图像中的零点。

通过边缘检测,我会扩张并填充检测到边缘的区域。基本上我的目标是制作一个盒子所在区域的blob。有了斑点,我就会知道盒子的确切位置,从而能够从输入图像中裁剪出盒子。 所以在这种情况下,我应该能够有四个blob,然后我就可以从输入图像中裁剪出四个图像。

这是我得到了多远: 分段图像:

query = imread('AllFour.jpg');
gray = rgb2gray(query);
[~, threshold] = edge(gray, 'sobel');
weightedFactor = 1.5;
BWs = edge(gray,'roberts');
%figure, imshow(BWs), title('binary gradient mask');

se90 = strel('disk', 30);
se0 = strel('square', 3);

BWsdil = imdilate(BWs, [se90]);
%figure, imshow(BWsdil), title('dilated gradient mask');

BWdfill = imfill(BWsdil, 'holes');
figure, imshow(BWdfill);
title('binary image with filled holes');

4 个答案:

答案 0 :(得分:2)

尝试调整图片大小。当你缩小它时,连接边缘会更容易。我尝试了下面显示的内容。您可能需要根据背景的性质对其进行调整。

close all;
clear all;

im = imread('1SGVm.jpg');
small = imresize(im, .25); % resize
grad = (double(imdilate(small, ones(3))) - double(small)); % extract edges
gradSum = sum(grad, 3);
bw = edge(gradSum, 'Canny');
joined = imdilate(bw, ones(3)); % join edges
filled = imfill(joined, 'holes');
filled = imerode(filled, ones(3));
imshow(label2rgb(bwlabel(filled))) % label the regions and show

enter image description here

答案 1 :(得分:2)

这是一个非常有趣的问题!这是我的解决方案,试图为您解决此问题。这假设背景在整个过程中具有相同的颜色分布。首先,使用rgb2hsv将图像从RGB转换为HSV颜色空间。 HSV色彩空间是分析色彩的理想转换。在此之后,我会查看饱和度和值平面。饱和度与颜色的“纯”有关,而值则是颜色本身的强度或亮度。如果您查看图像的饱和度和值平面,则会显示以下内容:

im = imread('http://i.stack.imgur.com/1SGVm.jpg');
out = rgb2hsv(im);
figure;
subplot(2,1,1);
imshow(out(:,:,2));
subplot(2,1,2);
imshow(out(:,:,3));

这就是我得到的:

enter image description here

通过查看灰色背景中的某些位置,看起来饱和度的大部分小于0.2,并且值平面中的元素大于0.3。因此,我们希望找到这些像素的相反来获取我们的对象。因此,我们发现那些饱和度大于0.2 那些像素值小于0.3的像素:

seg = out(:,:,2) > 0.2 | out(:,:,3) < 0.3;

这就是我们得到的:

enter image description here

几乎就在那里!有一些虚假的单个像素,所以我将使用imopen用行结构元素执行开放。

在此之后,我将使用imdilate进行扩张以消除任何间隙,然后使用imfill'holes'选项填补空白,然后使用{{{}进行侵蚀3}}将形状缩小回原始形状。就这样:

se = strel('line', 3, 90);
pre = imopen(seg, c);
se = strel('square', 20);
pre2 = imdilate(pre, se);
pre3 = imfill(pre2, 'holes');
final = imerode(pre3, se);
figure;
imshow(final);

final包含带有4个糖果盒的分段图像。这就是我得到的:

enter image description here

答案 2 :(得分:0)

如果您有最新版本的MATLAB,请尝试使用图像处理工具箱中的Color Thresholder应用。它允许您以不同的颜色空间进行交互式播放,以查看哪一个可以为您提供最佳分割。

答案 3 :(得分:-1)

如果你的糖果封面是固定的,或者你知道所有进入场景的封面,那么模板匹配是最好的。因为它独立于图像中的背景。

http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html