Matlab imshow 一个灰度矩阵

标签 matlab octave imshow

这是一个有趣的问题。

>> img = imread('a.pgm')
>> size(img)
ans

   192 168

>> imshow(img) % works fine

但是,我将相同的矩阵复制到 temp 并再次尝试 imshow。无法正常工作。

temp = zeros(192,168)
for i=1:192
   for j=1:168
      temp(i,j) = img(i,j)
   endfor
endfor

imshow(temp) % it is an empty image

为什么?

最佳答案

原因是因为当你这样做的时候

 temp = zeros(192,168)

MATLAB 分配一个 double 矩阵。因此,即使您将 uint8 放入矩阵中,矩阵 temp 的格式也会是 double,直到您不将其转换为 unit8。

之所以是白色,是因为 MATLAB 在处理 double 图像时期望强度在 [0....1] 范围内。所有超过 1 的东西(就像你的情况一样,除了 0 之外的所有东西)都被限制在 1,即最大强度,这显然意味着白色。

您可以通过将初始矩阵转换为

来解决它

temp = uint8(zeros(192,168))

或在最后

temp = uint8(temp)

或者仅用于在 imshow 调用中显示的目的:

imshow(uint8(temp))

一般来说,正如@Robert P. 在评论中正确指出的那样,复制图像的正确方法只是 temp = img

关于Matlab imshow 一个灰度矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24224117/

相关文章:

python - plt.imshow() 的单色图像显示为黑色

matlab - GPU 性能要求,最好的解决方案是什么?

javascript - 使用 JavaScript 创建 .mat 文件

windows - Octave : `char(97)` doesn't show result in console 中的奇怪问题

matlab - 从 m 大小的列索引向量创建一个由 0 和 1 组成的 m x n 矩阵

Python/Pyplot : Plotting 2D-Data at given (X, Y)

python - 没有 twiny 的 imshow 顶轴标签?

Matlab 只打开多页 tiff 堆栈的第一帧

matlab - 如何在整数秒内获取 Matlab 时间戳

matlab - 如何向量化矩阵的逐行对角化