Python中的imoverlay
我想用matplotlib的imshow()功能把一个矩阵叠加到另一个矩阵上。我希望叠加的矩阵是红色的,而“背景矩阵”则是骨色(bone),也就是一种颜色映射。所以,简单地把这两个图像相加是行不通的,因为你只能使用一种颜色映射。我还没有找到除了用imshow()直接相加之外的其他叠加方法。
我想大致替代这个matlab的模块。
请告诉我还有哪些其他选择!
2 个回答
1
我经常使用 OpenCV
,它的后端是 numpy
,所以图像其实就是一些矩阵。
要把一个二值图像叠加到背景图像上,你基本上可以这样做:
overlaycolour = [255,0,0] # for red
for each channel c in 1:3
overlayimage[:,:,c] = (1-alpha)*backgroundimage[:,:,c] +
alpha*binary[:,:,c]*overlaycolour[c]
这里的 alpha
是叠加层的透明度(如果 alpha
是 1,叠加层就完全贴在图像上;如果 alpha
是 0,叠加层就看不见;如果 alpha
在这两者之间,叠加层就会有点透明)。
另外,要么: - 二值图像(也就是要叠加的图像)是用 1 和 0 表示的,叠加颜色的范围是 0 到 255,或者 - 二值图像是用 255 和 0 表示的,叠加颜色的范围是 0 到 1。
最后,如果背景图像是灰色的,可以通过把这个单通道复制到红色、绿色和蓝色通道来变成彩色图像。
如果你想用特定的颜色映射来显示背景图像,你需要先处理好这个颜色映射,然后再传给叠加函数。
我不太确定在 PIL 中怎么写这种代码,但应该不会太难。
6
只需要使用一个 掩码数组。
例如:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
x = np.arange(100).reshape(10,10)
y = np.zeros((10,10))
# Make a region in y that we're interested in...
y[4:6, 1:8] = 1
y = np.ma.masked_where(y == 0, y)
plt.imshow(x, cmap=mpl.cm.bone)
plt.imshow(y, cmap=mpl.cm.jet_r, interpolation='nearest')
plt.show()