关于imshow显示double、uint8数据遇到的问题

MATLAB储存图像时一般会使用 uint8类型 (1个字节无符号整数,值在0~255之间),使用uint8类型可以起到节省存储空间的作用,但是由于uint8类型在0-255中间,所以在进行算术运算时很容易溢出,我们在进行算数运算前需要把uint8类型转换为double类型。

有一些图像不是以uint8类型储存的,而是直接以double类型储存的,或者我们为了进行运算把uint8类型转换为double类型还没有转换回去,这时如果我们想用 imshow() 函数来显示图像就会有一些要求。

如一个图像img,其数据类型为double类型,若imshow(img)得到白色图像,是因为 imshow()默认double类型的值为0到1,而大于1的值全显示为白色。

我在写图像的对数变换时,处理的一个图像img,为了对数变换运算,需要先将uint8类型的数据转化为double类型,运算后得到范围为3到6的double类型数据,

为图像正常显示,尝试了三种方法:

double类型显示:

(1) mat2gray(img)。使double类型数据强制归一化为0到1之间,再imshow()。

同样的方法还有 im2double(img),double(img)/255

(2) imshow(img,[])。 它不同于imshow(),imshow(img,[]) 使用 [min(img(:)) max(img(:))] 作为显示范围。imshow 将 img中的最小值显示为黑色,将最大值显示为白色。

uint8类型显示:

(1)将0到255的double类型数据转化为uint8数据(未成功)。正常情况下应该是可以的,因为matlab一般用uint8类型储存图像。

但在进行图像的对数变换中,没有成功,imshow(img)得到的图像为全黑。。。这是因为对数变换后,数据就变小了,double类型数据在3到6之间。在转化uint8后,都变成了整数型即3、4、5、6,显示出来自然为全黑。说明对数变换后,本身就不应该像以前一样用uint8去显示,因为数据变得很小了,对数变换后的数据就是要求你用double类型显示,要么归一化,要么imshow(img,[])。(这里没有说明 对数变换后只能用double类型数据显示,这个问题的本质,只总结了经验,待弄明白后补充)

总结:

运算时,需要将uint8类型转化为double类型,因为uint8范围在0到255,容易溢出,转化为double类型后,数值不变,但数据类型的范围变大了;

imshow一般用uint8类型显示,因为图像储存一般就用的uint8类型,可以节省储存空间;

imshow也可以显示double类型的数据,但前提是在0到1之间。若double类型数据大于1,必须归一化。

Original: https://blog.csdn.net/m0_46660998/article/details/123485162
Author: m0_46660998
Title: 关于imshow显示double、uint8数据遇到的问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/641769/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球