Image 在MATLAB中减去图像背景后出现蓝斑

Image 在MATLAB中减去图像背景后出现蓝斑,image,matlab,image-processing,computer-vision,Image,Matlab,Image Processing,Computer Vision,我曾在MatLab中尝试过图像减法,但意识到图像上有一个蓝色的大补丁。请参阅图片了解更多详细信息 另一张图片显示了蓝色补丁大约覆盖到的地方。 前两幅图像左侧的图片显示了减法后的图片。您可以忽略前两幅图像右侧的图片。这是原始图像之一: 这就是我要减去的背景。 这样做的目的是获取前景图像并对其进行blob,然后计算blob的数量,以查看从侧面垂直堆叠的书籍数量。我正在试验blobs方法如何在matlab上工作 有人知道吗?下面是我如何执行背景减法和显示背景减法的代码。谢谢 [filename

我曾在MatLab中尝试过图像减法,但意识到图像上有一个蓝色的大补丁。请参阅图片了解更多详细信息

另一张图片显示了蓝色补丁大约覆盖到的地方。

前两幅图像左侧的图片显示了减法后的图片。您可以忽略前两幅图像右侧的图片。这是原始图像之一:

这就是我要减去的背景。

这样做的目的是获取前景图像并对其进行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, []);

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

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

thresh = 250;
imdiff = sum(((rgbImage-backgroundImage).^2),3);
mask = uint8(imdiff > thresh);
maskedImage = rgbImage.*cat(3,mask,mask,mask);
imshow(maskedImage, []);
您将不得不反复使用阈值,直到获得所需的遮罩。您将遇到的问题是,背景不适合完成任务。例如,如果你把书放在绿色屏幕前,你可能会做得更好


由于要减去两幅彩色RGB图像,所以得到的是蓝色斑块。理想情况下,在差分图像中,您希望背景像素为零,前景像素为非零。由于您使用的是RGB,前景像素可能会有一些奇怪的颜色,这其实并不重要。您所关心的是差值的绝对值大于0


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

图片有帮助,但代码现在没有帮助。你能再解释一下数据的来源吗?是否从文件中读取
rgbImage
,以及
backgroundImage
?这些数据来自哪里?您是否做过任何类型的健全性检查,以确保问题出现在代码中,而不是数据本身?此外,直接减法很可能不是正确的答案。例如,假设rgb值分别在0和255之间。如果给定像素的蓝色值为25,而背景图像中相应的蓝色值为200,那么期望的结果是什么?新像素值是否应为-175?显然不是。这很可能就是你在这里看到的。嗨,谢谢你关于代码的建议。我对问题进行了编辑,以包含更多的代码。请看一看。我不确定问题是在代码中还是在数据中。我只使用了大约5天的MatLab,因此它的语法还不是很相似。关于我为什么使用直接减法,我从:,这个问题给出的答案之一中找到了方法。答案是:“如果你想减去一个常量值,或者一个与你的图像大小相同的背景,你只需写img=img-background.imsubtract”。或者你认为我应该用另一种方法删减背景吗?也许值得重读乔纳斯给那篇文章的答案。他说背景减法很容易,但他继续暗示这可能不是OP真正想要的。谢谢并同意,但如果我们说只有一本薄书,这意味着前景只占图片的10%到20%,背景占80%,在我blob之前对图像进行阈值化,它可能不会像大多数时候我希望的那样平滑。因此,减去背景的原因。基本上,当我使用visualstudioc时,我正在对两个图像(一个是背景图像,一个是书籍图像)进行比较,并删除所有相似的像素。我想知道是否有类似的方法来删除MatLab中的背景?请参阅我的编辑,以获取您所描述的技术的简单版本。当我尝试您的方法时,我得到以下错误。使用repmat时出错输入参数过多。以及行中的错误,掩码=repmat(uint8(imdiff>thresh),1,1,3);我认为这与repmat的参数有关?我在谷歌上搜索了一下,但是我们怎么知道最后2个参数的最佳值是多少呢?对我来说效果很好。但是,现在您提到了它,我看到过去在维度大于2时,
repmat
的实现不一致。我已将代码编辑为使用
cat
而不是
repmat
。谢谢!成功了。MATLAB的图像处理惯例与Visual Studio C++与OpenCV有很大的不同,我很难通过自学和实验来掌握这些约定和方法。我预见在不久的将来会有更多的问题。但是非常感谢(:我今天学到了一些东西。谢谢,我确实将它们转换为im2double,并转换回uint8,等等。但是结果仍然没有区别,蓝色补丁仍然存在。还有其他想法吗?等等,你不需要转换回uint8。你应该在对象和背景图像上使用im2double,然后使用abs(RGB图像-背景图像)You.试过了,它给出了稍微不同的结果,但是仍然没有像我希望的那样提取前景图像。奇怪的是,考虑到当我使用VisualStudioC++和OpenCV,并且使用了完全相同的比较方法时,它是成功的。我仍然试图理解语法和MATLAB是如何工作的。我设法解决了它。