Python中的imoverlay

4 投票
2 回答
4880 浏览
提问于 2025-04-17 10:40

我想用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()

在这里输入图片描述

撰写回答