python - 在 opencv - numpy - python 中转换颜色时失去抗锯齿

标签 python numpy opencv

我想转换图像中的颜色,从而保留抗锯齿和透明背景。 初始图像是具有透明背景的 png:

enter image description here

我使用以下代码将箭头从红色转换为绿色:

import numpy as np
import cv2

image = cv2.imread("C:/Temp/arr.png")
image = cv2.cvtColor(image, cv2.COLOR_BGR2BGRA)
cv2.imwrite('C:/Temp/source.png', image)

image[np.where((image == [0,0,255,255]).all(axis = 2))] = [0,255,0,255]

image = cv2.cvtColor(image, cv2.COLOR_BGR2RGBA)
image[np.all(image == [255, 255, 255, 255], axis=2)] = [255, 255, 255, 0]
cv2.imwrite('C:/Temp/target.png', image)

但是箭头尖端的对角线变得非常细:

enter image description here

我怎样才能改进这种颜色转换?

最佳答案

抗锯齿发生在您丢弃的 alpha channel 内。您无需执行 cvtColor,但将 alpha channel 保留在 imread 中。

结果:

enter image description here

import numpy as np
import cv2

image = cv2.imread("arr.png", cv2.IMREAD_UNCHANGED)
b, g, r, a = cv2.split(image)

bgr = cv2.merge((b, g, r))

all_g = np.ones_like(bgr)
all_g[:, :] = (0,255,0)

bgr = np.where(bgr == (0,0,255), all_g, bgr)

image = cv2.merge((bgr, a))

cv2.imwrite('target.png', image)

关于python - 在 opencv - numpy - python 中转换颜色时失去抗锯齿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51584560/

相关文章:

python - 如何在opencv中使用脊线检测过滤器

java - 从二进制 png 图像检索的像素数据中检测矩形

c++ - 如何为 OpenCV 找到对象的正确 HSV 阈值?

python - 向用户提供 Excel(xlsx) 文件以供在 Django(Python) 中下载

python - 关于 PJSUA 和编解码器的问题

python - 创建一个 NxM 矩阵 A 到 NxMxL 矩阵 B,其中 B[i,j, :] = kronecker_delta(A[i, j])?

python - OpenCV - 在 Python 中读取 16 位 TIFF 图像(sentinel-1 数据)

python - 正确的数据加载器设置可训练 fastrcnn-resnet50 以使用 pytorch 进行对象检测

python - 如何在字典中找到树的第一个节点?

python - numpy 数组的元素作为具有相同索引的自己的 pandas 行