如何在Matlab中将图像从double转换为uint8?

6
我有一张类型为double的图像I,我想把它转换成uint8类型。我尝试使用以下两种方法:
1. I=uint8(I) 2. I=im2uint8(I)
但是当我使用imshow(I)命令时,只显示了一个黑色图像,没有其他内容。我做错了什么呢?

"I=im2uint8(I)" 应该可以工作...你的图像包含什么数据?你能给一个4x4矩阵的例子来重现这个错误吗?你尝试过使用 "imshow(I,[])" 吗?如果你的图像是双精度的,值在0-1之间,你可以使用 "I=uint8(I*255);" - Ander Biguri
注意:应该是 im2uint8,而不是 img2uint8 - hbaderts
@AnderBiguri 先生,在这个问题中,phase_only图像的类型是double,但我无法通过以下两种方式查看该图像:1.使用im2uint8命令进行转换;2.然后使用imshow(I) - devraj
@hbaderts 先生,在这个问题中,phase_only图像的类型是double,但我无法通过以下两种方式查看该图像:1.使用im2uint8命令进行转换;2.然后使用imshow(I) - devraj
数据规范化是非常简单的任务,我相信你可以轻松完成一个简单的乘法运算 ;) - Ander Biguri
显示剩余3条评论
1个回答

10
im2uint8函数假定你的double图像缩放到范围[0,1]。如果你的图像的值大于1或小于0,这些值将被截断。请看下面的示例:
im2uint8([-1 0 0.5 1 2])
ans =
    0    0  128  255  255

解决方案是将输入图像进行缩放,通过减去最小值并除以总范围来将其缩放至[0,1]

I = (I - min(I(:))) / (max(I(:)) - min(I(:)));
I = im2uint8(I);
imshow(I);

是的,它正在工作。但为什么我使用您上面的代码和imshow(I,[])得到不同的结果? - devraj
imshow(I,[])中的I是原始的未缩放的double图像,应该(并且确实)产生与我的答案中描述的归一化、转换为uint8相同的结果。您确定您正在对原始图像调用imshow(I,[])吗? - hbaderts
2
你的变量 phase_only 是复数。使用 imshow(I,[]) 会先丢弃虚部,然后进行归一化。而我的代码会先进行归一化,然后再丢弃虚部。如果想要得到与 imshow(I,[]) 相同的结果,只需先调用 I = real(I) 即可。 - hbaderts
2
@devraj 你可能想绘制 phase_only 的幅度或相位,而不仅仅是实部。这只是需要考虑的一些事情。 - Dan
@devraj plot(abs(I)) - Dan
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接