Image Matlab中的元素矩阵除法只返回二进制值

Image Matlab中的元素矩阵除法只返回二进制值,image,matlab,image-processing,matrix,Image,Matlab,Image Processing,Matrix,我在Matlab中阅读两幅图像作为矩阵,并希望创建第三幅图像,计算如下: (im1-im2)./(im1+im2) 但是,我相信Matlab正在对元素除法的值进行四舍五入(我当然不希望这样)。例如,im1-im2的第一个值为32,im1+im2的第一个值为70。因此,结果矩阵的第一个值应该是32/70=0.4571,但它是0 如何在最终矩阵中保持原始除法结果值?这取决于图像数据和加载方式。例如,使用imread加载的8位图像存储为整数矩阵(uint8)。具有较高位深度的图像使用uint16或更

我在Matlab中阅读两幅图像作为矩阵,并希望创建第三幅图像,计算如下:

(im1-im2)./(im1+im2)
但是,我相信Matlab正在对元素除法的值进行四舍五入(我当然不希望这样)。例如,
im1-im2
的第一个值为32
im1+im2
的第一个值为70。因此,结果矩阵的第一个值应该是
32/70=0.4571
,但它是0


如何在最终矩阵中保持原始除法结果值?这取决于图像数据和加载方式。例如,使用
imread
加载的8位图像存储为整数矩阵(
uint8
)。具有较高位深度的图像使用
uint16
或更多存储

因此,您可以通过将矩阵转换为
double
来处理图像,然后再将其转换回适当的位深度,或者直接将其转换为所需的位深度并接受舍入,因为最后无论如何都需要进行舍入

im1 = double( imread('fig1.png') );
im2 = double( imread('fig2.png') ); 

result = uint32( (im1-im2)./(im1+im2) );

im1
im2
最有可能是
uint8
uint16
,将它们转换为
double
并执行此操作。请注意,像
*1.0
那样隐式地转换它们是不起作用的

比如

im1 = double(im1);
im2 = double(im2);
thingYouWant = (im1 - ...;
请注意,转换回
uint
将再次为您留下1(值高于0.5)或0(值低于0.5)。要转换回
uint8
,您需要执行以下操作:

resultInUint8 = uint8(thingYouWant * 255); % Linear scale from 0 to 255

另外需要注意的是,如果
im2
大于
im1
,则
double(im1-im2)
将导致0。因此,您可能会得到图像的一半为0。最好在进行任何操作之前进行转换。

我使用single(im1-im2)解决了这个问题。/single(im1+im2)。谢谢那可能是C代码?但是没有有效的Matlab语法。@thewaywewalk是的,你是对的,把符号和c#混淆了。固定的。