Я хочу перекрасить изображение в другой базовый цвет, но при этом сохранить градиенты. Например, на этой картинке базовый цвет - зеленый.
и я хочу изменить его на базовый цвет, например, синий (RGB: 0,119,153). Я использовал следующий код на Python:
import numpy as np
import cv2
dg = [0,59,10]
mg = [0,91,16]
lg = [0,106,18]
db = [92,71,0]
mb = [153,119,0]
lb = [204,163,93]
im = cv2.imread("C:/Temp/recolor_source.png")
im[np.where((im == dg).all(axis=2))] = db
im[np.where((im == mg).all(axis=2))] = mb
im[np.where((im == lg).all(axis=2))] = lb
cv2.imwrite("C:/Temp/recolor_result.png", im)
что дает следующий результат:
Вокруг белого текста и на серой кнопке на итоговом изображении все еще есть немного зеленого цвета. Как правильно преобразовать в другой базовый цвет и сохранить все градиенты?
Привет, Марк, спасибо за ответ. Это действительно помогает. :). Для полноты картины теперь все цвета будут повернуты на 80 градусов. Таким образом, мы могли бы сначала идентифицировать определенные зеленые области по определению цвета (например, pyimagesearch.com/2016/02/15/…), а затем выполнить преобразование только для ROI. Сама конвертация добавлена как отдельный ответ на мой вопрос. Еще раз спасибо.






Это ответ, предложенный Марком Сетчеллом.
import cv2
im = cv2.imread("C:/Temp/recolor_source.png")
hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
hchannel = hsv[:, :, 0]
hchannel = 40 + hchannel
hsv[:, :, 0] = hchannel
rgb = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite("C:/Temp/recolor_result.png", rgb)
Круто - молодец, спасибо, что поделился с сообществом. Удачи тебе с твоим проектом!
Обратите внимание, что вы можете добиться того же, просто используя ImageMagick в командной строке для модуляции оттенка, как этот convert widget.png -modulate 100,100,150 result.png. Это означает ... «оставьте яркость и насыщенность неизменными на уровне 100% от их существующих значений и смодулируйте оттенок до 150% от исходного значения» См. imagemagick.org/script/command-line-options.php#modulate
Вы можете попробовать преобразовать в цветовое пространство HSV и взять все оттенки между 110..130 (т.е. зеленые) и добавить к ним 80 градусов, чтобы сделать их синими en.m.wikipedia.org/wiki/HSL_and_HSV За исключением того, что имейте в виду, что OpenCV использует 0..180, а не 0..360, чтобы вы могли нужно уменьшить вдвое эти числа. Затем конвертируйте обратно в обычный BGR.