使用 NumPy 屏蔽 QImage 的 alpha 值时出现意外结果

Unexpected result when masking alpha values of QImage using NumPy

我需要使用 numpy 数组来屏蔽 QImage 上的 alpha 值。

我读过不同的方法,但其中 none 非常有效。

我还尝试在列表上使用 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")

输入轮廓:

蒙版生成的图像:

期望的结果应该与输入相似,请注意除了额外的曲线外,线条更粗。

不知道程序哪里错了

n Python,除 0 即 "False" 外,所有数字都被视为 "True",因此当您将布尔值转换为 "alpha" 时,如果像素为 10在灰度中是黑色,它变成 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")

输出: