“双重”vs。"uint8"输入使用"imshow"函数

678次浏览(过去30天)
卡什
卡什 2011年12月1日
编辑: 为副总经理 2022年7月27日
当使用命令“imshow(image)”时,当“image”有类型“double”时,我得到一个错误。如果我将“image”转换为“uint8”类型,则“imshow”会生成图像。为什么有一个错误类型“双”?
4评论
沃尔特·罗伯森
沃尔特·罗伯森 2022年5月21日
//www.tatmou.com/matlabcentral/answers/22785-double-vs-uint8-input-using-imshow-function#comment_2066009包含了一个详尽的可能性列表。

登录评论。

接受的答案

丹尼斯Vreshtazi
丹尼斯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函数减少图像中的颜色数量。这个函数对颜色图中的颜色进行量化,以减少图像中不同颜色的数量。有关更多信息,请参见减少索引图像中的颜色。
4评论
沃尔特·罗伯森
沃尔特·罗伯森 2020年1月27日
Rgb2ind获取颜色编号。可能在ind2rgb后面添加不同的颜色。

登录评论。

更多答案(9)

Junaid
Junaid 2011年12月1日
Uint8使用无符号8位整数。这就是像素的范围。像素值不能大于2^8 -1。因此,对于图像使用uint8类型。而double用于处理非常大的数字。有许多函数,他们只把双倍作为输入卵形存储器超出范围。
很容易将double转换为uint8或其他方式。
假设我有一个矩阵uin8a。
然后把它转换成2倍,你只需要这样做
A = double(A);
或者将它转换回uint8。
A = uint8(A);
4评论

登录评论。


Vinai Datta Thatiparthi
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,因为它只有一个平面。
希望这对你有所帮助。
1评论
沃尔特·罗伯森
沃尔特·罗伯森 2019年3月27日
编辑:沃尔特·罗伯森 2019年3月27日
TIF图像和动画GIF可以是4D的,为体素数组中的每个位置分配颜色的图像也可以是4D的。DICOM可以是4D的,尤其是超声波。

登录评论。


摩诃Arbasia
摩诃Arbasia 2020年4月17日
编辑:摩诃Arbasia 2020年4月17日
我找到了一些有用的信息,可能会有帮助

此前Mounesisohi
此前Mounesisohi 2016年6月24日
你所需要做的就是把下面的代码加进去:
一个= im2double (B);
B是第8单元矩阵A是二阶矩阵。
祝你好运。

香港成
香港成 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的变量
2的评论
沃尔特·罗伯森
沃尔特·罗伯森 2021年6月1日
数值数组的数据类型对于整个数组是相同的。不能有一个数字数组,其中一些元素是双精度的,而另一些元素不是双精度的。
你应该写一个新的数组,比如
Dbs (i1) = double(bs(i1));
或者你应该转换整个数组,比如
DBS = double(bs);

登录评论。


Pranit帕蒂尔
Pranit帕蒂尔 2018年3月8日
我读了一个rgb图像,我想要图像的直方图,但当我给出命令imhist('xyz.jpg')时,它给了我错误,只是绘制x -y轴,而不是其中的图形。它完全是白色的。请帮助我,图像已经在uint8。
1评论
沃尔特·罗伯森
沃尔特·罗伯森 2018年3月8日
您不能将文件名传递给imhist:您需要将文件imread()到一个数组中,然后将数组传递给imhist。

登录评论。


MathWorks支金宝app援小组
一个 N全白图像显示 发生在 图像数据不在默认的图像显示范围内。对于类的图像 double,取值范围为[0,1]。去工作 然后用' DisplayRange 参数imshow .  例如, 考虑下面的命令,其中输入参数是来自热成像摄像机的图像 图像处理工具箱
imshow (“hotcoffee.tif”
如果检查图像中的像素值,就会发现它们超出了默认范围,例如23.6268 ,因此图像显示为全白色。 如果使用空括号[]指定显示范围,则"imshow"计算显示范围并正确显示图像:
imshow (“hotcoffee.tif”“DisplayRange”[])

Mohammad suhaan dar
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中,只有几种可能性
  1. 你有一个数据类型为整型的3D数组,第三维的长度为3,对于给定的位置,所有三个分量都恰好是该整型数据类型的最小值。在这种情况下,像素将是黑色的。
  2. 你有一个数据类型为single()或double()的3D数组,第三维的长度为3,对于任何给定的位置,所有三个分量都是非正的;在这种情况下,像素将是黑色的
  3. 你有一个数据类型为整数的3D数组,第三维的长度为3,对于任何给定的位置,所有三个分量都完全相同,不为零。在这种情况下,像素将是白色的。
  4. 你有一个数据类型为single()或double()的3D数组,第三维的长度为3,对于任何给定的位置,如果取min(components,1)结果将是非零,并且彼此相等,在65536的一部分内;在这种情况下,像素将是白色的。例如,[pi, sqrt(2), 1], min() that against 1剪辑到[1,1,1],它们都相等;结果是白色的
  5. 你有一个三维长度为3的3D数组,但以上4种情况都不适用;在这种情况下,像素既不是黑色也不是白色(它是彩色的)
  6. 你有一个整数或浮点数的标量、向量或2D数组。在这种情况下,像素显示的颜色将取决于轴的CLim属性(可以由caxis()控制),以及轴或图形的Colormap属性(可以由Colormap()控制)。在这种情况下,颜色可能是可以通过颜色映射表示的任何颜色。
你列出的6种情况都属于最后一种情况,标量,矢量或2D数组,所以你没有足够的信息来知道它们是否会显示为黑色或白色或完全其他的东西。例如,
P = uint8(20);
图像(p + 50);
colormap(粉色)
这并不是非黑即白。用不同的颜色图,它肯定会变成黑色,或者白色,或者蓝色,或者紫色,或者任何你想要的颜色。

登录评论。


马希Jabeen
马希Jabeen 2022年7月27日
编辑:马希Jabeen 2022年7月27日
我想知道我的答案有什么问题。你能解释一下吗? @Walter罗伯森
1评论
为副总经理
为副总经理 2022年7月27日
编辑:为副总经理 2022年7月27日
哦,之前问的时候我不知道这道题是多项选择题。我想最后一个选项也是对的。任何单位规模(即在[0 1]范围内)的浮点图像如果加50将被渲染为白色。这样做可能不会有什么成效,但它 是白色的。
我可以理解为什么有些人会随意地忽略这个选项,因为它一开始看起来就很荒谬。

登录评论。

类别

了解更多转换图像类型帮助中心而且文件交换

标签

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!

翻译的