为什么 Octave 和 MATLAB 都会自动移动此图像中的灰度值?

信息处理 图像处理 matlab 八度
2022-01-28 04:16:00

编辑:我发现另一个问题实际上解决了我遇到的一个单独但可能相关的问题。但是,在以下情况下,图像在uint8读取到 Octave 和 MATLAB 时都在其中,因此它实际上并没有解决这个特定问题。

我正在阅读Scientist and Engineer's Guide to Digital Signal Processing并尝试本章后面给出的图像处理示例。但是我遇到了一个奇怪的问题,它使我的进度停滞不前,因为它使我无法预测会发生什么。

我从一开始就使用 Octave,但今天下载了 MATLAB 的试用版,它的功能完全相同。

这是一个例子。我创建了一个测试图像来试验灰度变换。这是原始的PNG:

在此处输入图像描述

在 Octave 中,我运行以下代码:

>> dots3 = imread('dots_3gray.png');
>> imshow(dots3);

我得到了这个结果:

在此处输入图像描述

正如您所看到的,这些值都发生了变化——Octave(以及 MATLAB)显示的图像已经降低了所有值,因此白色现在是深灰色,灰色现在是黑色。(忽略大小差异,第二个是截屏)两者都是100x100像素的灰度图。Octave 读取的矩阵中的最小值为 0,最大值为 158。

有趣的是,使用 Paint.NET 中的吸管工具,我检查了原始 PNG 中的值范围,最小值(在灰点的中心)为 96,最大值(在白色字段中)为 255——a 159 的差异,这与 Octave 读取的点 3 中报告的数字 [0, 158] 范围内的步数完全一致。因此,这里似乎正在发生某种转变。

我可以通过将像素值移动 97(255 和 158 之间的差异)来使图像以正确的颜色显示:

>> imshow(dots3 + 97)

知道为什么会发生这种行为吗?这让我很难对算法进行试验,因为我不知道更改是由代码还是由 Octave / MATLAB 自己造成的。

平台是 Windows 10。谢谢。

1个回答

您的图像是索引图像。这意味着它采用整数值,这些值应该通过特定的颜色映射映射到屏幕上的颜色。

如果您将图像读取为:

[I, M] = imread('dots_3gray.png');

whereI成为您的“索引”图像(似乎包含从 0 到 158 的索引),并且M用于colormap解释它。

如果您查看文档,imshow您会看到专门针对索引图像,您可以指定要使用的颜色图;在这种情况下M,按预期查看:

imshow(I, M)

如果您不希望这是索引图像,并且您希望将其转换为标准灰度图像(即在 [0,1] 范围内)以便您可以进一步处理它,您可以执行此转换使用ind2gray命令:

G = ind2gray (I,M); % convert to uint8 grayscale image in the range [0,255]
G = im2double (G);  % convert to double precision image in the range [0,1]



有关更多信息,请参阅我对stackoverflow 中类似问题的回答。