1

我在 MatLab 中尝试过图像减法,但意识到图像上有一个大的蓝色补丁。请查看图片了解更多详情。

在此处输入图像描述 另一张图片显示了蓝色补丁大约覆盖的位置。 在此处输入图像描述

前2张左边的图片为减法后的图片,可以忽略前2张右边的图片。这是原始图像之一: 在此处输入图像描述

这就是我要减去的背景。 在此处输入图像描述

目的是获取前景图像并对其进行blob,然后计算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, []);
4

2 回答 2

1

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

顺便说一句,您的图像可能是未签名的 uint8。im2double在进行减法之前,您可能希望将它们转换为 double 使用。

于 2013-10-20T15:42:22.763 回答
1

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

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

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

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

结果图像显示已移除背景的书籍

于 2013-10-20T09:23:50.403 回答