我来到一个matlab
代码,它首先读取图像并将其转换double
为如下:
I = double(imread(img));
之后,它显示如下图像:
imshow(I/max(I(:)))
这意味着什么?尤其是当我移除max
零件时,我只得到一张白色背景的图像。这种划分的目标是什么?而且,为什么它在完成后正确显示图像,如果您直接显示读取的图像而不用最大除法,为什么不能正确显示图像?
谢谢。
表达方式:
I/max(I(:))
只是将像素值标准化为范围 0..1.0。它通过将所有像素值除以最大值来实现这一点。
max(I(:))
似乎是一个规范化步骤
从文档中可以看出,imshow 需要一个值介于 0 和 1.0 之间的输入矩阵
imshow(I) 在 Handle Graphics® 图形中显示图像 I,其中 I 是灰度、RGB(真彩色)或二值图像。对于二值图像,imshow 将值为 0(零)的像素显示为黑色,值为 1 为白色。
I
是 2D 或 3D 矩阵(取决于灰度或颜色)。I(:)
是矩阵的所有值都写在一列中的向量,就像它们在内存中排列一样;你也可以这样做reshape
。请阅读Matlab 文档中有关冒号运算符的更多信息,它是 Matlab 的绝对基本概念。
max
给你一个向量的最大值,即max(I(:))
给你整个图像的最大值。
图像的范围从 0 开始是不成文的规律。因此,您可以通过将图像[0,1]
除以来映射图像的值max(I(:))
。在 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]
之前的原因。