matplotlib 用第二个图像覆盖图像并应用像素透明度-未按预期工作

2skhul33  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(139)

在matplotlib版本上测试:'3.5.2'和3.6.0
这感觉像一个错误,但我不确定我是否错过了什么时,使用彩色图像与阿尔法掩码。
我有两个图像A和B。
B应该作为一个覆盖应用,并有三个颜色通道。大多数像素是0,这将被过滤掉的阿尔法掩码。
第一次
现在的问题是,当我想把它们组合起来的时候,我得到了完整的图像B。
此设置中未使用每像素Alpha:

plt.imshow(A)
plt.imshow(B, alpha=alphas)
plt.title("result")
plt.show()

当我将B降低到灰度时,它会按预期工作,但很明显,它使用的是cmap,而不是我的颜色通道。

plt.imshow(A)
plt.imshow(B[:,:,0], alpha=alphas)
plt.title("one channel result")
plt.show()


指令集
MRE代码:

import matplotlib as m
import matplotlib.pyplot as plt
import numpy as np

A=np.arange(5*5*3).reshape((5,5,3)) / (5*5*3)

plt.imshow(A)
plt.title("A")
plt.show()

B = np.zeros(5*5*3).reshape((5,3,5))
B[2:4, 2:4] = 1
B.shape = (5,5,3) # do some shifting so its not grayscale
plt.imshow(B)
plt.title("B")
plt.show()

alphas = np.zeros(5*5).reshape((5,5))
alphas[B[:,:,1] > 0] = 0.66
plt.imshow(alphas)
plt.title("Alpha mask")
plt.show()

plt.imshow(A)
plt.imshow(B, alpha=alphas) # gives wrong result
plt.title("wrong result")
plt.show()
am46iovg

am46iovg1#

我把“alpha”作为一个5x5的数组来测试,但是“imshow”忽略了这个数组,所以我把“B”和一个“alpha”列连接起来,得到了一个(5x5x4)RGBA矩阵,叫做“C”。
因此,您不需要在“imshow”中传递“alpha”数组参数。

import matplotlib as m
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(2, 3, figsize=(6, 5))
ax1 = ax[0, 0]
ax2 = ax[0, 1]
ax3 = ax[1, 0]
ax4 = ax[1, 1]
ax5 = ax[0, 2]
ax6 = ax[1, 2]

A = np.arange(5*5*3).reshape((5, 5, 3)) / (5*5*3)
ax1.imshow(A)
ax1.set_title("A")

B = np.zeros(5*5*3).reshape((5, 3, 5))
B[2:4, 2:4] = 1
#B.shape = (5, 5, 3) # do some shifting so its not grayscale
B = B.reshape((5, 5, 3))
ax2.imshow(B)
ax2.set_title("B")

alphas = np.zeros(5*5).reshape((5, 5))
alphas[B[:, :, 1] > 0] = 0.66
ax3.imshow(alphas)
ax3.set_title("Alpha mask")

alphas_2 = alphas.reshape(5, 5, 1)
C = np.dstack((B, alphas_2))

ax4.imshow(A)
ax4.imshow(B)
ax4.set_title("A and B")

ax5.imshow(C)
ax5.set_title("C")

ax6.imshow(A)
ax6.imshow(C)
ax6.set_title("A and C")

plt.show()

相关问题