错误的背景减法

时间:2017-05-06 12:25:40

标签: matlab image-processing background-subtraction

我试图用两张图片减去图像的背景。 图片int binary_exec(void * Address){ int i; __disable_irq(); // Disable IRQs for (i = 0; i < 8; i ++) NVIC->ICER[i] = 0xFFFFFFFF; // Clear pending IRQs for (i = 0; i < 8; i ++) NVIC->ICPR[i] = 0xFFFFFFFF; // -- Modify vector table location // Barriars __DSB(); __ISB(); // Change the vector table SCB->VTOR = ((uint32_t)0x4000 & 0x1ffff80); // Barriars __DSB(); __ISB(); __enable_irq(); // -- Load Stack & PC binExec(Address); return 0; } __asm void binexec(uint32_t *address) { mov r1, r0 ldr r0, [r1, #4] ldr sp, [r1] blx r0" 是背景,图片A是背景图片。 enter image description here

我正在规范图像,但我没有得到预期的结果。 这是代码:

B

生成的图像是完全黑暗的图像。感谢用户saeed masoomi的回答,我意识到这是因为数据类型,所以现在,我有以下代码:

a = rgb2gray(im);
b = rgb2gray(im2);
resA = ((a - min(a(:)))./(max(a(:))-min(a(:))));
resB = ((b - min(b(:)))./(max(b(:))-min(b(:))));
resAbs = abs(resB-resA);
imshow(resAbs);

生成的图片没有得到很好的过滤,图片a = rgb2gray(im); b = rgb2gray(im2); resA = im2double(a); resB = im2double(b); resAbs = imsubtract(resB,resA); imshow(resAbs,[]); 的某些部分没有出现但应该出现。

enter image description here

如果我在没有规范化的情况下尝试这样做,我仍然会遇到同样的问题。 enter image description here

图片BA之间的唯一区别是仅显示在图片B中的手臂,因此它们应该没有任何切割。

你能看到什么问题吗?也许我应该过滤一个阈值?

2 个答案:

答案 0 :(得分:0)

您好请注意您的数据类型 ... matlab中的图像保存在unsigned char(或int)中(8位0到255并且没有0.1或0.2或任何浮点数所以,如果你有1.2输出将是1)。

uint8数据中的计算错误,如下所示

max=uint8(255);                         %uint8
min=uint8(20);                          %uint8
data=uint8(40);                         %uint8
normalized=(data-min)/(max-min)         %uint8

输出

normalized =

uint8

0

ooops,您可能认为此输出将为0.0851但不是因为数据类型为uint8且输出为0 ...所以我猜您的所有数据都为零(结果图像很暗 )...为了防止这个错误,MATLAB有一个名为 im2double 的便捷功能(将uint8转换为double,所有数据在0和1之间归一化)

  

I2 = im2double(I)将强度图像I转换为双精度,必要时重新调整数据。我可以是灰度强度图像,真彩色图像或二值图像。

所以我们可以像下面那样重写你的代码

a = rgb2gray(im);
b = rgb2gray(im2);
resA = im2double(a);
resB = im2double(b);
resAbs = abs(imsubtract(a,b));    %edited
imshow(resAbs,[])

<强>编辑

因此,如果输出图像再次变暗,则必须通过以下代码检查两个图像是否具有不同的像素!!

if(isempty(nonzeros))
  disp('Two image is diffrent -> normal')
else
  disp('Two image is same -> something wrong')
end

答案 1 :(得分:0)

不要将两张图像标准化。背景减法通常使用相同的相机设置完成,因此两个图像可直接比较。如果背景图像中没有明亮的物体,那么像你那样进行标准化会使它变得明亮起来。第二张图片。强度不再具有可比性,你可以看到没有的差异。

如果您使用不同的相机设置(不同的曝光时间,照明等)记录背景图像,那么背景减法比您想象的要复杂得多。您必须应用优化方案才能使两个图像具有可比性,以使它们的差异很小。你必须仔细研究文献,但这并不是一件轻而易举的事。