MATLAB中图像的差分

qlckcl4x  于 2022-12-29  发布在  Matlab
关注(0)|答案(1)|浏览(238)

我有两个图像要融合。图像为AB
我已经融合了它们,并得到了这个图像fused现在我想要融合图像F和图像B之间的差异。我已经执行了代码,但没有得到理想的结果
我得到这个图像-〉differencenormalized difference,但我想要这个-〉Required
差分图像的值被归一化到0到1的范围。
使用的代码为

difference=F-B;
figure,imshow(difference);
normImage = mat2gray(difference);
figure,imshow(normImage);

有人能帮忙吗。谢谢。

unguejic

unguejic1#

使用:

R = mat2gray(im2double(F)-im2double(B));

我的结果是:

若要了解转换为双精度的重要性,请查看图像中B(y,x) > F(y,x)的区域,例如示例图像中的(343, 280)

>> F(343,280)
ans = 32
>> B(343,280)
ans = 107

数学上,我们期望32 - 107等于-75,但是:

>> F(343,280) - B(343,280)
ans = 0

这是因为FB都是uint8的数组:

>> class(F)
ans = uint8
>> class(B)
ans = uint8

作为无符号整数,uint8不能取负值,因此任何试图将负值赋给uint8变量的操作都会导致0。由于两个操作数都是uint8,结果是uint8。在该值已被箝位为0 - 255范围内的值之后,尝试将其强制转换为双精度型,将只会导致值为0的双精度型变量。(在范围的上限也会发生同样的情况。尝试uint8(444)。)
FB转换为带符号类型(一个足够大的类型,范围是-max到+max,或者在本例中是-255到255)将解决数学问题:

>> int16(F(343,280)) - int16(B(343,280))
ans = -75

不过对于图像来说,转换为double感觉更自然,在计算和重新缩放时比整数更精确,另外,我们可以使用这个方便的im2double函数,它不仅可以将数组转换为双精度数,还可以将所有值重新缩放到0和1之间:

>> Fd = im2double(F);
>> Fd(343,280)
ans = 0.1255   % 32.0/255.0

>> Bd = im2double(B);
>> Bd(343,280)
ans = 0.4196   % 107.0/255.0

但是现在当我们试着减去这两个的时候,我们实际上得到了一个负值,就像预期的那样:

>> Fd(343,280) - Bd(343,280)
ans = -0.2941  % -75.0/255.0

因此,im2double(F)-im2double(B)为我们提供了-1.0到1.0之间的双精度值。mat2gray负责将这些值缩放回0.0到1.0的范围以供显示。
注意:我非常小心地选择了坐标(343,280),因为这是F-B最负的地方。如果你对转换是如何发生的以及什么值被缩放到什么感兴趣,你也可以看看(53,266)。

相关问题