2014-09-06 46 views
1

我想覆盖同一场景的两个视图 - 一个是白光图像(单色,用于参考),另一个是特定波段(具有我正在展示的真实数据)中的图像。正确的方式覆盖多波段图像?

白光图像是“参考”,数据图像是“数据”。它们是相同尺寸的普通2D numpy阵列。我想使用'灰色'颜色地图显示白色参考图像,使用'热'颜色地图显示数据图像。

什么是“正确”的方式来做到这一点?

我开始用这样的:

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

我不完全确定你想达到什么,但希望这会给你一些想法。 :)

我从来没有使用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格式,并将V(值)数据替换为来自ref_rgb的灰度数据。而且你可以用S(饱和度)数据做类似的技巧,尽管效果通常有点微妙。