Image 显示图像

Image 显示图像,image,matlab,show,Image,Matlab,Show,我找到了一个matlab代码,它首先读取一个图像并将其转换为double,如下所示: I = double(imread(img)); imshow(I/max(I(:))) 之后,显示如下图像: I = double(imread(img)); imshow(I/max(I(:))) 这是什么意思?特别是当我删除max部分时,我只得到了一张白色背景的图像。这种划分的目的是什么?而且,为什么它在完成时正确显示图像,而如果您直接显示读取的图像而不按最大值进行除法,则不能正确显示图像 谢谢。

我找到了一个
matlab
代码,它首先读取一个图像并将其转换为
double
,如下所示:

I = double(imread(img));
imshow(I/max(I(:)))
之后,显示如下图像:

I = double(imread(img));
imshow(I/max(I(:)))
这是什么意思?特别是当我删除
max
部分时,我只得到了一张白色背景的图像。这种划分的目的是什么?而且,为什么它在完成时正确显示图像,而如果您直接显示读取的图像而不按最大值进行除法,则不能正确显示图像

谢谢。

表达方式:

I/max(I(:))
只需将像素值标准化为0..1.0范围。它通过将所有像素值除以最大值来实现此目的。

表达式:

I/max(I(:))
只需将像素值标准化为0..1.0范围。它通过将所有像素值除以最大值来实现这一点。

max(I(:)
似乎是一个规范化步骤

根据以下内容,imshow需要一个值介于0和1.0之间的输入矩阵

imshow(I)在Handle Graphics®图形中显示图像I,其中I 是灰度、RGB(真彩色)或二值图像。对于二进制图像, imshow将值为0(零)的像素显示为黑色,值为1的像素显示为黑色 白色的

max(I(:)
似乎是一个正常化步骤

根据以下内容,imshow需要一个值介于0和1.0之间的输入矩阵

imshow(I)在Handle Graphics®图形中显示图像I,其中I 是灰度、RGB(真彩色)或二值图像。对于二进制图像, imshow将值为0(零)的像素显示为黑色,值为1的像素显示为黑色 白色的


I
是2D或3D矩阵(取决于灰度或颜色)
I(:)
是一个向量,其中矩阵的所有值都写在一列中,就像它们在内存中排列一样;你也可以这样做。请阅读中有关冒号运算符的更多信息,它是Matlab的绝对基本概念

max
提供向量上的最大值,即
max(i(:)
提供整个图像上的最大值

图像的范围从0开始是一条不成文的定律。因此,您可以将图像的值除以
max(I(:)
,将其映射到
[0,1]
。在Matlab中是这样做的:
myMatrix/myScalar

因此,
I/max(I(:)
为您提供了在
[0,1]
中具有值的图像,您希望使用
imshow
显示的双图像需要什么

请注意:

(1) 您可以编写
imshow(I,[])
,它将向您显示值拉伸到
[0,1]
的图像(与您的版本不同,最小值也映射到0)

(2) 在我看来,只有在像您这样的特殊情况下,您才应该映射图像的值以进行可视化。它可能会给您错误的图像印象(例如,非常暗的图像将被视为全对比度图像)。尝试按原始值范围的最大值进行偏差(通常为255、4095或65535)。例如:

img = imread('some12bit.png');
img = double(img);
img = img / 4095; % [0,4095] -> [0,1]
imshow(img);

(3) 如果不将图像映射到
[0,1]
,所有值
>1
将被解释为
1
。这就是为什么您的图像显示为白色图像,而之前未将其映射到
[0,1]

I
是二维或三维矩阵(取决于灰度或颜色)
I(:)
是一个向量,其中矩阵的所有值都写在一列中,就像它们在内存中排列一样;你也可以这样做。请阅读中有关冒号运算符的更多信息,它是Matlab的绝对基本概念

max
提供向量上的最大值,即
max(i(:)
提供整个图像上的最大值

图像的范围从0开始是一条不成文的定律。因此,您可以将图像的值除以
max(I(:)
,将其映射到
[0,1]
。在Matlab中是这样做的:
myMatrix/myScalar

因此,
I/max(I(:)
为您提供了在
[0,1]
中具有值的图像,您希望使用
imshow
显示的双图像需要什么

请注意:

(1) 您可以编写
imshow(I,[])
,它将向您显示值拉伸到
[0,1]
的图像(与您的版本不同,最小值也映射到0)

(2) 在我看来,只有在像您这样的特殊情况下,您才应该映射图像的值以进行可视化。它可能会给您错误的图像印象(例如,非常暗的图像将被视为全对比度图像)。尝试按原始值范围的最大值进行偏差(通常为255、4095或65535)。例如:

img = imread('some12bit.png');
img = double(img);
img = img / 4095; % [0,4095] -> [0,1]
imshow(img);

(3) 如果不将图像映射到
[0,1]
,所有值
>1
将被解释为
1
。这就是为什么您的图像显示为白色图像,而之前未将其映射到
[0,1]

谢谢您的回复。这种情况是,我有一个灰度图像,其中最小值是
77
,最大值是
113
。为什么如果不进行规范化,就无法获得预期的输出?如果将
double
值传递到
imshow
中,它们需要在0范围内。。1-更多详情请参见@Nick的答案。例如,如果我们有值
77
,是否将其设置为
77.0
?在此上下文中,
double
的确切含义是什么?是的,
double
将整像素值
77
转换为双精度浮点值
77.0
。然后将其缩放为范围为0.的值。。当你除以最大像素值时为1.0。它确实是这样的,标准化会将它(除以113)设置为
0.6814
,谢谢你的回复。这种情况是,我有一个灰度图像,其中最小值是
77
,最大值是
113
。为什么如果不进行规范化,就无法获得预期的输出?如果将
double
值传递到
imshow
中,它们需要在0范围内。。1-更多详情请参见@Nick的答案。如果我们有