我在MatLab中尝试过图像减法,但意识到图像上有一个很大的蓝色斑块。请参阅图片了解更多详情。
另一张图片显示了蓝色补丁大致覆盖的位置。
前2幅图像左侧的图片显示减法后的图片。您可以忽略前2幅图像右侧的图片。这是原始图像之一:
这是我减去的背景。
目的是获取前景图像并对其进行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, []);
答案 0 :(得分:1)
因为前景对象(即书籍)是不透明的,所以背景根本不会影响那些像素。换句话说,你正在减去那些不存在的东西。您需要的是一种检测图像中哪些像素对应于前景,哪些像素对应于背景的方法。不幸的是,解决这个问题可能至少与您首先要解决的问题一样困难。
如果您只想与背景进行逐像素比较,可以尝试以下方法:
thresh = 250;
imdiff = sum(((rgbImage-backgroundImage).^2),3);
mask = uint8(imdiff > thresh);
maskedImage = rgbImage.*cat(3,mask,mask,mask);
imshow(maskedImage, []);
您必须使用阈值,直到获得所需的屏蔽。您将遇到的问题是背景不适合该任务。例如,如果你把书放在绿色屏幕前面,你可能会做得更好。
答案 1 :(得分:1)
你正在获得蓝色补丁,因为你正在减去两个颜色的RGB图像。理想情况下,在差异图像中,您希望背景像素为零,前景像素为非零。由于你是RGB,前景像素可能最终会有一些奇怪的颜色,这并不重要。你所关心的只是差异的绝对值大于0。
顺便说一下,你的图片可能是uint8,它是无符号的。在进行减法之前,您可能希望使用im2double
将它们转换为double。