使用NumPy掩盖QImage的alpha值时出现意外结果

时间:2019-07-17 17:37:37

标签: python pyside2 qimage

我需要使用一个numpy数组来掩盖QImage上的alpha值。

我已经阅读了不同的方法,但是没有一个是非常有效的。

我还尝试在列表上使用for循环,以测试它是否是一个numpy错误,但结果却相同。我不明白我在哪里犯错。

from PySide2.QtGui import QImage
from PySide2.QtCore import Qt
import numpy as np
import qimage2ndarray as q2np

contour = QImage()
contour.load("contour.png")
contour.convertTo(QImage.Format_Grayscale8)

np_cont = q2np.byte_view(contour)
np_cont = np_cont.reshape(np_cont.shape[:-1])

red = QImage(contour.size(), QImage.Format_ARGB32)
red.fill(Qt.red)

alpha = q2np.alpha_view(red)
alpha *= np_cont.astype(np.bool)

red.save("result.png")

输入轮廓:

contour.png

蒙版生成的图像:

result.png

所需的结果应类似于输入,请注意,除了其他曲线以外,线条还更粗。

我不确定程序哪里出错了。

1 个答案:

答案 0 :(得分:1)

n Python,除0表示“ False”外,所有数字均视为“ True”,因此,如果将像素10转换为灰度黑色,则将布尔值转换为“ alpha”时,它将变为1布尔值范围内为白色,以便它生成更改,因此使用astype(np.bool)转换为布尔值不是最佳选择,而是建立更合适的阈值,例如127:

from PySide2.QtGui import QImage
from PySide2.QtCore import Qt
import numpy as np
import qimage2ndarray as q2np

contour = QImage()
contour.load("contour.png")
contour.convertTo(QImage.Format_Grayscale8)
np_cont = q2np.byte_view(contour)
np_cont = np_cont.reshape(np_cont.shape[:-1])
red = QImage(contour.size(), QImage.Format_ARGB32)
red.fill(Qt.red)

alpha = q2np.alpha_view(red)
alpha *= np_cont > 127  # .astype(np.bool)
red.save("result.png")

输出:

enter image description here