我想覆盖同一场景的两个视图 - 一个是白光图像(单色,用于参考),另一个是特定波段的图像(具有显示的真实数据) )。
白光图像是"参考",数据图像是"数据"。它们是相同尺寸的普通2D numpy阵列。我想使用' grey'来显示白色参考图像。彩色地图,以及使用' hot'彩色地图。
什么是"适当的"这样做的方法?
我从这开始:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
hotm = cm.ScalarMappable(cmap='hot')
graym = cm.ScalarMappable(cmap='gray')
ref_rgb = graym.to_rgba(reference) # rgba reference image, 'gray' color map
data_rgb = hotm.to_rgb(data) # rgba data image, 'hot' color map
plt.imshow(ref_rgb + data_rgb)
这并没有奏效,因为在plt.imshow()
调用中,总和溢出了范围0..1(或者可能是0..255;这令人困惑)并给了我疯狂的颜色。
然后我用这个替换了最后一行:
plt.imshow(ref_rgb/2 + data_rgb/2)
虽然有效,但却给我一张非常褪色的低对比度图片。
最后,我尝试了这个:
plt.imshow(np.maximum(ref_rgb, data_rgb))
这似乎给出了最好的结果,但我担心我的大部分数据"通过使r,g或b值低于参考图像而丢失。
什么是"适当",或"通常"这样做的方法?
答案 0 :(得分:0)
我不确定你想要达到的目标,但希望这会给你一些想法。 :)
我从未使用过matplotlib,但是从快速浏览一下文档,看起来matplotlib.cm可以让你选择让像素数据在0..255范围内作为整数,或者在0.0中作为浮点数。 .1.0范围。浮点格式对于算术图像处理更方便,所以我假设在这个答案的其余部分就是这种情况。
我们可以通过对RGB像素值进行简单算术来进行基本图像处理。粗略地说,向所有像素的RGB值添加(或减去)常数会改变图像亮度,将像素乘以常数会改变图像对比度,将像素提高到恒定(正)功率会改变图像伽玛。当然,您需要确保这些操作不会导致颜色值超出范围。对于伽马调整或对比度调整(假设常量在0.0..1.0范围内),这不是问题,但它可能是亮度修改的问题。更微妙的亮度&对比度修改可以通过加法和乘法的适当组合来实现。
在进行此类操作时,将图像数据中的像素值规范化为0.0..1.0范围通常是一个好主意,无论是在& /之前还是在完成主要处理之后。
上面的代码主要是将灰度参考数据视为一种掩码,并使用其值而不是使用常量来逐像素地操作颜色数据。正如你所见,采取ref_rgb&的平均值data_rgb会导致图像褪色,因为您正在降低对比度。但是看看当你乘以ref_rgb& data_rgb:对比度通常会增加,因为ref_rgb中的暗区会使data_rgb中的相应像素变暗,但ref_rgb中的亮区会使data_rgb中的相应像素保持不变。
ImageMagick有一些很好的算术图像处理示例。
要尝试的另一件事是将data_rgb转换为HSV格式,并使用ref_rgb中的灰度数据替换V(值)数据。你可以用S(饱和度)数据做类似的技巧,虽然效果通常有点微妙。