Перекрасить изображение в другой базовый цвет с сохранением градиентов

Я хочу перекрасить изображение в другой базовый цвет, но при этом сохранить градиенты. Например, на этой картинке базовый цвет - зеленый.

Перекрасить изображение в другой базовый цвет с сохранением градиентов

и я хочу изменить его на базовый цвет, например, синий (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)

что дает следующий результат:

Перекрасить изображение в другой базовый цвет с сохранением градиентов

Вокруг белого текста и на серой кнопке на итоговом изображении все еще есть немного зеленого цвета. Как правильно преобразовать в другой базовый цвет и сохранить все градиенты?

Вы можете попробовать преобразовать в цветовое пространство HSV и взять все оттенки между 110..130 (т.е. зеленые) и добавить к ним 80 градусов, чтобы сделать их синими en.m.wikipedia.org/wiki/HSL_and_HSV За исключением того, что имейте в виду, что OpenCV использует 0..180, а не 0..360, чтобы вы могли нужно уменьшить вдвое эти числа. Затем конвертируйте обратно в обычный BGR.

Mark Setchell 16.08.2018 00:08

Привет, Марк, спасибо за ответ. Это действительно помогает. :). Для полноты картины теперь все цвета будут повернуты на 80 градусов. Таким образом, мы могли бы сначала идентифицировать определенные зеленые области по определению цвета (например, pyimagesearch.com/2016/02/15/…), а затем выполнить преобразование только для ROI. Сама конвертация добавлена ​​как отдельный ответ на мой вопрос. Еще раз спасибо.

Bill Bridge 16.08.2018 07:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
1 000
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это ответ, предложенный Марком Сетчеллом.

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)

В результате чего:

Круто - молодец, спасибо, что поделился с сообществом. Удачи тебе с твоим проектом!

Mark Setchell 16.08.2018 09:17

Обратите внимание, что вы можете добиться того же, просто используя ImageMagick в командной строке для модуляции оттенка, как этот convert widget.png -modulate 100,100,150 result.png. Это означает ... «оставьте яркость и насыщенность неизменными на уровне 100% от их существующих значений и смодулируйте оттенок до 150% от исходного значения» См. imagemagick.org/script/command-line-options.php#modulate

Mark Setchell 16.08.2018 12:02

Другие вопросы по теме