Измените определенный цвет изображения с помощью Python - PullRequest
0 голосов
/ 13 июля 2020

У меня есть изображение с лицом девушки, и я хотел бы изменить цвет ее глаз, начиная с определенного цвета, используя RGB в python. У меня есть этот цвет:

rbg_source=[85, 111, 47]

и этот цвет в качестве целевого

rbg_destination=[72.50445669, 56.82411376, 47.7519902]

реконструкция изображения как оригинального, заменяя только упомянутые цвета.

У вас есть идея сделать это в python?

Я уже использовал следующее решение:

 resized_image[np.all(resized_image == (85, 111, 47), axis=-1)] = (72.50445669, 56.82411376, 
 47.7519902)

 # Save result
 cv2.imwrite('result1.png',resized_image)

Но оно возвращает плохое изображение без ожидаемого решения.

Ниже приведен пример изображения

образ

на этом изображении, я хотел бы изменить цвет правого глаза, зная RGB этого цвета, т.е. (5, 155, 122)

1 Ответ

1 голос
/ 14 июля 2020

Вот один из способов сделать это в Python / OpenCV, поскольку у меня нет соответствующих цветов RGB для синего и зеленого, которые вы хотите использовать. Поэтому я буду приблизительно использовать базовые синий и зеленый.

  • Чтение ввода
  • Преобразование в HSV и отдельные каналы
  • Укажите оттенки синего и зеленого и получите разницу оттенков
  • Пороговое значение для диапазона зеленого цвета для создания маски
  • Используйте морфологию для очистки маски
  • Добавьте разницу оттенков в канал оттенка и по модулю 180
  • Объедините новый оттенок, старый канал насыщенности и канал старого значения, который смещен для увеличения яркости в соответствии с цветом левого глаза и преобразования обратно в BGR
  • Используйте маску для объединения нового BGR и исходного изображения
  • Сохранить результаты

Введите:

enter image description here

import cv2
import numpy as np

# load image with alpha channel
img = cv2.imread('eyes.png')

# convert to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsv)

# blue is 240 in range 0 to 360; so half in OpenCV
# green is 120 in range 0 to 360; so half in OpenCV
blue_hue = 120
green_hue = 60

# diff hue (blue_hue - green_hue)
diff_hue = blue_hue - green_hue

# create mask for green color in hsv
lower = (30,90,90)
upper = (90,170,180)
mask = cv2.inRange(hsv, lower, upper)
mask = cv2.merge([mask,mask,mask])

# apply morphology to clean mask
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
mask = cv2.morphologyEx(mask, cv2.MORPH_ERODE, kernel)

# modify hue channel by adding difference and modulo 180 
hnew = np.mod(h + diff_hue, 180).astype(np.uint8)

# recombine channels and bias value to make brighter
hsv_new = cv2.merge([hnew,s,v+60])

# convert back to bgr
bgr_new = cv2.cvtColor(hsv_new, cv2.COLOR_HSV2BGR)

# blend with original using mask
result = np.where(mask==(255, 255, 255), bgr_new, img)

# save output
cv2.imwrite('eyes_green_mask.png', mask)
cv2.imwrite('eyes_green2blue.png', result)

# Display various images to see the steps
cv2.imshow('mask',mask)
cv2.imshow('bgr_new',bgr_new)
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyAllWindows()
 

Mask

enter image description here

Hue and Value shifted BGR image:

enter image description here

Result:

введите описание изображения здесь

ДОПОЛНЕНИЕ:

Если вы знаете точные синие и зеленые цвета BGR, вы можете преобразовать их каждый в HSV и получить различия H, S, V . Затем используйте эти различия в качестве смещения для каналов H, S, V входного изображения и используйте маску, чтобы объединить этот результат с исходным, как я сделал выше.

...