【问题标题】:How to restore previous colormap in matlab?如何在matlab中恢复以前的颜色图?
【发布时间】:2015-02-02 20:28:19
【问题描述】:

我有一些数字范围内的图像。这是一个图像示例:

这是图像的Laplacian Pyramid 中的一个级别。 (没有必要了解拉普拉斯金字塔是什么……)

现在我需要对这些图像进行一些操作,并且需要为此更改颜色图。我将其更改为灰色(256)并进行了我需要的操作。所以现在我在colormap(gray(256)) 中有不同的图像。

现在我需要缩减到之前的范围。但我不知道以前的范围或颜色图。我尝试在操作之前保存颜色图。

我试过了:

imwrite(img,colormap(gray(256)),str);

但这会将整个矩阵更改为 255。

正确的做法是什么?

【问题讨论】:

  • 设置颜色图不应影响图像(即矩阵中的值)。它只改变它的显示方式。所以真正的答案取决于您是只想显示图像(即使用imshow(I,[]) 之类的东西),还是要重新调整矩阵中的值(即让imwrite 正常工作)。
  • 我没有提到我使用了imwriteimwrite(img,colormap(gray(256)),str); 然后重新阅读图像。所以矩阵确实改变了......
  • 嗯,这比您之前提供的代码更相关。 (已编辑)

标签: matlab colormap


【解决方案1】:
imwrite(img,colormap(gray(256)),str);

colormap 只设置figure 的颜色,所以imwrite 中不需要它。事实上,它在这里没有任何价值。如果您传递一个地图gray(256),它会将其写入索引图像。也就是说,它将像素值和说明这些值含义的地图都保存在文件中。

但是,它不会缩放输入图像以整齐地匹配颜色图。如文档中所述:

如果 A 是数据类型为 double 或 single 的索引图像,则 imwrite 通过从每个索引中减去 1 将索引转换为从零开始的索引 元素,然后将数据写入 uint8。如果 A 中的数据是 单,在写入 GIF 或 TIFF 文件之前将 A 转换为双精度。

这意味着如果您的 img 包含 256 或以上的所有值,imwrite 将减去 1,并写为 uint8,将超过 255 到 255(以及低于 0 到 0)的值剪裁。所以你的图像显示为所有 255。

您需要先将 img 缩放到适当的范围(例如,记录输入矩阵的最大值和最小值 - 而不是 colormap! - 在对它执行任何操作之前)。这只是数学 - 例如img = img/256 之类的东西可能就是您所需要的。在大多数情况下,无需使用地图保存 - 您只是将值写入灰度,您可以使用 imwrite 将它们保存到普通图像中。

imwrite 通常期望 double 在 0 到 1 的范围内,uint8 在 0 到 255 的范围内。如果您的值不匹配,您将得到 clipping/"blank " 图像等。

但是,由于在大多数图像格式中值都存储为整数 (uint8),我看不出如何使用 imwrite 来保存示例中显示的值而不损失精度。您也无法保存任何负值。因此,最好以不同的格式(*.mat 文件、csv 等)保存您的实际值,并在需要时保存图像以进行可视化,而不是用于存储计算值。

【讨论】:

  • 缩小后,我会做一些其他操作,使结果图像在 [0..255] 范围内。只有这样我才会显示图像。这是经过测试的并且有效。因此,无需担心显示图像。所以你建议保存最小值和最大值,将img 缩放到 [0..255](也许是mod(img,256)?)进行我需要的操作,然后使用最小值和最大值恢复到以前的范围?
  • 这取决于你想对图像/结果做什么。您显示带有负浮点数的值 - 这些值无法通过 imwrite 很好地保存/恢复。 (但不要使用mod - 这会破坏您的数据!)。如果我的值具有物理意义,我个人会尽量避免这种缩放,以保留它们的格式保存这些值,并使用其他在显示上自动缩放的方法(例如 imshowimagesc 中的 [] )。
猜你喜欢
  • 2012-10-02
  • 2012-06-07
  • 2014-02-08
  • 2021-09-28
  • 2014-10-22
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多