我在一些数字范围内有一些图像。这是一个图像的例子:
这是图片Laplacian Pyramid中的级别。 (没有必要了解拉普拉斯金字塔是什么......)
现在我需要对这些图像进行一些操作,我需要更改颜色图。我将它改为灰色(256)并进行了我需要的操作。所以现在我在colormap(gray(256))
中有不同的图像。
现在我需要缩小到之前的范围。但我不知道以前的范围或色彩图。我尝试在操作之前保存色彩映射。
我试过了:
imwrite(img,colormap(gray(256)),str);
但是将整个矩阵改为255。
这样做的正确方法是什么?
答案 0 :(得分:1)
imwrite(img,colormap(gray(256)),str);
colormap
仅设置figure
的颜色,因此您在imwrite
中不需要它。事实上,它在这里没有任何价值。如果您传递地图gray(256)
,它会将其写为索引图像。也就是说,它会在文件中保存像素值和地图,这些值表示这些值的含义。
但是,它不会缩放输入图像以巧妙地匹配色彩映射。正如文档中所述:
如果A是数据类型为double或single的索引图像,则为imwrite 通过从每个索引中减去1将索引转换为从零开始的索引 元素,然后将数据写为uint8。如果A中的数据是 单个,在写入GIF或TIFF文件之前将A转换为double。
这意味着如果您的img
包含所有256或更高的值,imwrite
将减去1,并写为uint8
,剪裁值超过255到255(及低于0)到0)。所以你的图像全部显示为255。
您需要先将img
缩放到适当的范围(例如,在对其执行任何操作之前记录输入矩阵的最大值和最小值 - 而不是colormap
! - )。这只是数学 - 例如像img = img/256
这样的东西可能就是你所需要的。在大多数情况下,没有必要使用地图保存它 - 您只是将您的值写为灰度,您可以使用imwrite
将它们保存到普通图像中。
imwrite
通常希望double
的范围为0到1,uint8
的范围为0到255.如果您的值不匹配,则,你会得到剪辑/"空白"图像等。
但是,由于值以大多数图像格式存储为整数(uint8
),因此我不知道如何使用imwrite
保存您在示例中显示的值的类型不失精度。您也无法保存任何负值。因此,最好以不同的格式(*.mat
文件,csv等)保存您的实际值,并在需要可视化时保存图像,但不能存储计算值。