0

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

I = double(imread(img));

之后,它显示如下图像:

imshow(I/max(I(:)))

这意味着什么?尤其是当我移除max零件时,我只得到一张白色背景的图像。这种划分的目标是什么?而且,为什么它在完成后正确显示图像,如果您直接显示读取的图像而不用最大除法,为什么不能正确显示图像?

谢谢。

4

3 回答 3

3

表达方式:

I/max(I(:))

只是将像素值标准化为范围 0..1.0。它通过将所有像素值除以最大值来实现这一点。

于 2013-04-25T09:52:31.293 回答
2

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

文档中可以看出,imshow 需要一个值介于 0 和 1.0 之间的输入矩阵

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

于 2013-04-25T09:53:38.327 回答
0

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]之前的原因。

于 2013-04-25T12:34:55.557 回答