Потеря сглаживания при преобразовании цвета в opencv - numpy - python

1

Я хочу преобразовать цвет в изображение, тем самым сохраняя сглаживание и прозрачный фон. Исходным изображением является png с прозрачным фоном:

Изображение 174551

Я использую следующий код для преобразования стрелки от красного в зеленый:

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)

Но диагональные линии наконечника стрелки становятся очень зернистыми:

Изображение 174551

Как я мог улучшить это преобразование цвета?

Теги:
opencv
numpy

1 ответ

1
Лучший ответ

Сглаживание происходит в пределах альфа-канала, который вы выбросили. Вам не нужно выполнять cvtColor, но чтобы сохранить альфа-канал в imread.

Результат:

Изображение 174551

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)
  • 0
    Спасибо за ваше решение и помощь. Это здорово! Очевидно, мне нужно немного больше изучить функциональность numpy.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню