Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 覆盖多波段图像的正确方法?_Python_Image_Numpy_Matplotlib - Fatal编程技术网

Python 覆盖多波段图像的正确方法?

Python 覆盖多波段图像的正确方法?,python,image,numpy,matplotlib,Python,Image,Numpy,Matplotlib,我想叠加同一场景的两个视图-一个是白光图像(单色,用于参考),另一个是特定波段的图像(具有我显示的真实数据) 白光图像为“参考”,数据图像为“数据”。它们是相同尺寸的普通2D numpy数组。我想用“灰色”颜色贴图显示白色参考图像,用“热”颜色贴图显示数据图像 这样做的“正确”方式是什么 我从这个开始: import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cm hotm = cm.ScalarMa

我想叠加同一场景的两个视图-一个是白光图像(单色,用于参考),另一个是特定波段的图像(具有我显示的真实数据)

白光图像为“参考”,数据图像为“数据”。它们是相同尺寸的普通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(ref_rgb/2 + data_rgb/2)
这不太好,因为在
plt.imshow()
调用中,总和溢出了范围0..1(或者可能是0..255;这令人困惑),并给了我疯狂的颜色

然后我将最后一行替换为:

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(ref_rgb/2 + data_rgb/2)
这是可行的,但给了我一个非常褪色的,低对比度的图像

最后,我尝试了以下方法:

plt.imshow(np.maximum(ref_rgb, data_rgb))
这似乎给出了最好的结果,但我担心我的大部分“数据”会因为r、g或b值低于参考图像而丢失


做这件事的“适当”或“通常”方法是什么?

我不太确定你想要实现什么,但希望这能给你一些想法。:)

我从未使用过matplotlib,但快速查看文档,matplotlib.cm似乎为您提供了将像素数据作为0..255范围内的整数或0.0..1.0范围内的浮点值的选项。浮点格式对于算术图像处理更为方便,因此我将在本答案的其余部分中假设是这种情况

我们可以通过对RGB像素值进行简单的运算来进行基本的图像处理。粗略地说,在所有像素的RGB值上加(或减)一个常数会改变图像亮度,将像素乘以一个常数会改变图像对比度,将像素提高到一个常数(正)会改变图像伽马。当然,您确实需要确保这些操作不会导致颜色值超出范围。这对于gamma调整或对比度调整(假设常数在0.0..1.0范围内)来说不是问题,但对于亮度修改来说可能是问题。通过适当的加法和乘法组合,可以实现更细微的亮度和对比度调整

在执行此类操作时,通常最好在完成主处理之前和/或之后,将图像数据中的像素值规格化为0.0..1.0范围

上面的代码实质上是将灰色参考数据视为一种遮罩,并使用其值(而不是使用常数)逐像素对颜色数据进行操作。如您所见,采用ref_rgb和data_rgb的平均值会导致图像褪色,因为您正在降低对比度。但是,看看当您将ref_rgb和data_rgb相乘时会发生什么:对比度通常会增加,因为ref_rgb中的暗区域将使data_rgb中的相应像素变暗,但ref_rgb中的亮区域将使data_rgb中的相应像素几乎不受影响

有一些很好的算术图像处理的例子

另一个尝试是将数据_rgb转换为HSV格式,并用ref_rgb中的灰度数据替换V(值)数据。您可以对S(饱和度)数据执行类似的操作,尽管效果通常有点微妙