我需要使用一个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")
输入轮廓:
蒙版生成的图像:
所需的结果应类似于输入,请注意,除了其他曲线以外,线条还更粗。
我不确定程序哪里出错了。
答案 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")
输出: