“双重”vs。"uint8"输入使用"imshow"函数
678次浏览(过去30天)
显示旧的注释
当使用命令“imshow(image)”时,当“image”有类型“double”时,我得到一个错误。如果我将“image”转换为“uint8”类型,则“imshow”会生成图像。为什么有一个错误类型“双”?
接受的答案
丹尼斯Vreshtazi
2018年11月11日
转换图像存储类
您可以转换uint8和uint16数据使用MATLAB函数,双精度。但是,存储类之间的转换改变了MATLAB和工具箱解释图像数据的方式。如果希望将结果数组正确地解释为图像数据,则需要在转换数据时调整数据的比例或偏移量。
为了更容易地转换存储类,可以使用下列工具箱函数之一:im2double、im2uint8和im2uint16。这些函数自动处理原始数据的缩放和偏移。例如,该命令将数据范围为[0,1]的双精度RGB图像转换为数据范围为[0,255]的uint8 RGB图像。
RGB2 = im2uint8(RGB1);
在转换中丢失信息
当您转换到使用更少位来表示数字的类时,通常会丢失图像中的一些信息。例如,uint16强度图像能够存储多达65,536个不同灰度的灰度,但uint8强度图像只能存储256个不同灰度的灰度。当你将uint16强度图像转换为uint8强度图像时,im2uint8量化了原始图像中的灰色阴影。换句话说,原始图像中所有从0到127的值在uint8图像中都变成0,从128到385的值都变成1,以此类推。然而,这种信息的丢失通常不是问题,因为256仍然超过了您的眼睛可能识别的灰色阴影的数量。
转换索引图像
将索引图像从一个存储类转换为另一个存储类并不总是可能的。在索引图像中,图像矩阵只包含颜色映射的索引,而不包含颜色数据本身,因此在转换过程中不可能对颜色数据进行量化。
例如,一个有300种颜色的uint16或双索引图像不能转换为uint8,因为uint8数组只有256个不同的值。如果要执行此转换,必须首先使用imapproximate函数减少图像中的颜色数量。这个函数对颜色图中的颜色进行量化,以减少图像中不同颜色的数量。有关更多信息,请参见减少索引图像中的颜色。
更多答案(9)
Vinai Datta Thatiparthi
2019年3月27日
编辑:Vinai Datta Thatiparthi
2020年2月28日
嗨!要添加到线程,
所有图像都存储并表示为一个矩阵(2-D或3-D)。在Matlab中存储矩阵或数组信息的默认设置是双精度。它使用64位来存储任何数字。但是,对于图像像素的密度,其范围一般为0-255。8位足以描述这个信息。作为一种节省内存和更有效表示的方法,我们使用uint8, uint16, uint32, uint64等…
Im = imread(“random_picture.jpg”);
imshow (im);
imshow(双(im));
通过这个例子,你可以更好地理解Uint8和double的区别。
此外,您可以直接使用术语作为命令,轻松地从一个类转换到另一个类。为了获得更详细的细节,我们可以将像素的强度设置为(2^16 -1),(2^32 -1)等等…
作为扩展,这里的8位表示存储一个平面图像信息所需的比特数。对于RGB图像,比特深度,即表示所有图像信息所需的比特总数,将变成24。对于灰度图像,位深度将简单地为8,因为它只有一个平面。
希望这对你有所帮助。
香港成
2017年4月26日
我想你们在阅读图片时可能会遇到它们。如果是真的,当你读取一个图像使用
A = imread(”picture.png”)
函数,那么你将得到一个变量
一个
比如这个a*b*3 unit8,,它的值从0到255,但是如果你转换这个变量
一个
使用
B = im2double(A)
那么你就会得到某种变量
B
比如a*b*3 double,其值从0到1不等
在你使用这个函数之后
灰色= rgb2gray(I2)
你会得到一个像a*b double的变量
MathWorks支金宝app援小组
2020年2月27日
一个
N全白图像显示
发生在
图像数据不在默认的图像显示范围内。对于类的图像
double,取值范围为[0,1]。去工作
然后用'
DisplayRange
参数imshow .
例如,
考虑下面的命令,其中输入参数是来自热成像摄像机的图像
图像处理工具箱
:
imshow (“hotcoffee.tif”)
如果检查图像中的像素值,就会发现它们超出了默认范围,例如23.6268
,因此图像显示为全白色。
如果使用空括号[]指定显示范围,则"imshow"计算显示范围并正确显示图像:
imshow (“hotcoffee.tif”,“DisplayRange”[])
0评论
Mohammad suhaan dar
2021年9月21日
编辑:沃尔特·罗伯森
2022年1月24日
假设
p
是一个
uint8
带值像素
20.
而且
问
是一个
uint8
带值像素
210
.下面哪个会显示为黑色像素?
im2double (p 40)
Im2double (p) - 40
P - 40
Q + 40
im2double (q-40)
Im2double (q) - 40
5个评论
沃尔特·罗伯森
2022年3月25日
在MATLAB中,只有几种可能性
- 你有一个数据类型为整型的3D数组,第三维的长度为3,对于给定的位置,所有三个分量都恰好是该整型数据类型的最小值。在这种情况下,像素将是黑色的。
- 你有一个数据类型为single()或double()的3D数组,第三维的长度为3,对于任何给定的位置,所有三个分量都是非正的;在这种情况下,像素将是黑色的
- 你有一个数据类型为整数的3D数组,第三维的长度为3,对于任何给定的位置,所有三个分量都完全相同,不为零。在这种情况下,像素将是白色的。
- 你有一个数据类型为single()或double()的3D数组,第三维的长度为3,对于任何给定的位置,如果取min(components,1)结果将是非零,并且彼此相等,在65536的一部分内;在这种情况下,像素将是白色的。例如,[pi, sqrt(2), 1], min() that against 1剪辑到[1,1,1],它们都相等;结果是白色的
- 你有一个三维长度为3的3D数组,但以上4种情况都不适用;在这种情况下,像素既不是黑色也不是白色(它是彩色的)
- 你有一个整数或浮点数的标量、向量或2D数组。在这种情况下,像素显示的颜色将取决于轴的CLim属性(可以由caxis()控制),以及轴或图形的Colormap属性(可以由Colormap()控制)。在这种情况下,颜色可能是可以通过颜色映射表示的任何颜色。
你列出的6种情况都属于最后一种情况,标量,矢量或2D数组,所以你没有足够的信息来知道它们是否会显示为黑色或白色或完全其他的东西。例如,
P = uint8(20);
图像(p + 50);
colormap(粉色)
这并不是非黑即白。用不同的颜色图,它肯定会变成黑色,或者白色,或者蓝色,或者紫色,或者任何你想要的颜色。