在MATLAB中减去图像背景后出现蓝色色块

时间:2013-10-20 07:04:33

标签: image matlab image-processing computer-vision

我在MatLab中尝试过图像减法,但意识到图像上有一个很大的蓝色斑块。请参阅图片了解更多详情。

enter image description here 另一张图片显示了蓝色补丁大致覆盖的位置。 enter image description here

前2幅图像左侧的图片显示减法后的图片。您可以忽略前2幅图像右侧的图片。这是原始图像之一: enter image description here

这是我减去的背景。 enter image description here

目的是获取前景图像并对其进行blob,然后计算斑点的数量,以查看从侧面垂直堆叠的书籍数量。我正在试验blobs方法如何在matlab上运行。

有人有任何想法吗?下面是我如何执行背景减法以及显示它的代码。感谢。

[filename, user_canceled] = imgetfile;
fullFileName=filename;
rgbImage = imread(fullFileName);


folder = fullfile('C:\Users\Aaron\Desktop\OPENCV\Book Detection\Sample books');
baseFileName = 'background.jpg'; 
fullFileName = fullfile(folder, baseFileName);

backgroundImage =imread(fullFileName);
rgbImage= rgbImage - backgroundImage;

%display foreground image after background substraction%%%%%%%%%%%%%%

subplot( 1,2,1);
imshow(rgbImage, []);

2 个答案:

答案 0 :(得分:1)

因为前景对象(即书籍)是不透明的,所以背景根本不会影响那些像素。换句话说,你正在减去那些不存在的东西。您需要的是一种检测图像中哪些像素对应于前景,哪些像素对应于背景的方法。不幸的是,解决这个问题可能至少与您首先要解决的问题一样困难。

如果您只想与背景进行逐像素比较,可以尝试以下方法:

thresh = 250;
imdiff = sum(((rgbImage-backgroundImage).^2),3);
mask = uint8(imdiff > thresh);
maskedImage = rgbImage.*cat(3,mask,mask,mask);
imshow(maskedImage, []);

您必须使用阈值,直到获得所需的屏蔽。您将遇到的问题是背景不适合该任务。例如,如果你把书放在绿色屏幕前面,你可能会做得更好。

Result image showing books with background removed

答案 1 :(得分:1)

你正在获得蓝色补丁,因为你正在减去两个颜色的RGB图像。理想情况下,在差异图像中,您希望背景像素为零,前景像素为非零。由于你是RGB,前景像素可能最终会有一些奇怪的颜色,这并不重要。你所关心的只是差异的绝对值大于0。

顺便说一下,你的图片可能是uint8,它是无符号的。在进行减法之前,您可能希望使用im2double将它们转换为double。