我来到matlab
代码,首先读取图片并将其转换为double
,如下所示:
I = double(imread(img));
之后,它显示如下图像:
imshow(I/max(I(:)))
这是什么意思?特别是当我删除max
部分时,我只得到一张白色背景的图像。这种划分的目标是什么?并且,为什么它在完成时正确显示图像,如果直接显示读取的图像而没有按最大值划分,则不能正确显示图像?
感谢。
答案 0 :(得分:3)
表达式:
I/max(I(:))
将像素值标准化为0..1.0范围。它通过将所有像素值除以最大值来实现。
答案 1 :(得分:2)
max(I(:))
似乎是一个标准化步骤
从documentation开始,imshow需要一个输入矩阵,其值介于0和1.0之间
imshow(I)在HandleGraphics®图中显示我的图像 是灰度,RGB(真彩色)或二进制图像。对于二进制图像, imshow显示值为0(零)为黑色且1为的像素 白。
答案 2 :(得分:0)
I
是2D或3D矩阵(取决于灰度或颜色)。 I(:)
是一个向量,矩阵的所有值都写在一列中,就像它们被安排在内存中一样;你也可以reshape
做。请在Matlab documentation中阅读更多关于冒号运算符的内容,这是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]
之前的原因。