Как я могу изменить цвет фона на красный цвет изображения с помощью Python

У меня есть следующий код, который отлично работает, но не заполняет весь фон. Я играл с цифрами, но это либо делает все изображение красным, либо не меняет фон.
Как я могу изменить цвет фона изображения?

Картинка, я хочу изменить ее фон]:
enter image description here

import cv2
import numpy as np
from google.colab import drive
drive.mount('/content/drive')
image=cv2.imread('/content/drive/MyDrive/tulips.jpg')
r = 720.0 / image.shape[1]
dim = (720, int(image.shape[0] * r))
resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
lower_white = np.array([80, 1, 1],np.uint8) #lower hsv value
upper_white = np.array([130, 255, 255],np.uint8) #upper hsv value
hsv_img = cv2.cvtColor(resized,cv2.COLOR_BGR2HSV)#rgb to hsv color space
#filter the background pixels 

frame_threshed = cv2.inRange(hsv_img, lower_white, upper_white) 

kernel = np.ones((5,5),np.uint8) 

dilation = cv2.dilate(frame_threshed,kernel,iterations = 2)
resized[dilation==255] = (0,0,255) #convert background color
cv2_imshow(resized)

после этого кода я получаю это изображение:
enter image description here

объясните свой выбор границ HSV для inRange

Christoph Rackwitz 09.04.2022 12:11
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
1
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я подумал, что мы можем просто использовать cv2.floodFill и заполнить белый фон красным цветом.
Проблема в том, что изображение недостаточно чистое - есть артефакты JPEG и неровные края.

Использование cv2.inRange может приблизить нас, но если есть несколько белых тюльпанов (которые мы не хотим превратить в красные), нам, возможно, придется использовать floodFill для заливки только фона.

Я выделил следующие этапы:

  • Преобразование цветового пространства RGB в HSV.
  • Примените порог на канале насыщенности - белый фон почти равен нулю в цветовом пространстве HSV.
  • Применить открывающую морфологическую операцию для удаления артефактов.
  • Применяем floodFill, на изображение порога - заливаем фон значением 128.
    Фон будет 128.
    Черные пиксели внутри области тюльпанов будут равны 0.
    Большая часть площади тюльпанов остается белой.
  • Установите все пиксели, где порог равен 128, в красный цвет.

Пример кода:

import cv2
import numpy as np
image = cv2.imread('tulips.jpg')

# Fill the black background with white color
#cv2.floodFill(image, None, seedPoint=(0, 0), newVal=(0, 0, 255), loDiff=(2, 2, 2), upDiff=(2, 2, 2))  # Not working!

hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)  # rgb to hsv color space

s_ch = hsv_img[:, :, 1]  # Get the saturation channel

thesh = cv2.threshold(s_ch, 5, 255, cv2.THRESH_BINARY)[1]  # Apply threshold - pixels above 5 are going to be 255, other are zeros.
thesh = cv2.morphologyEx(thesh, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7)))  # Apply opening morphological operation for removing artifacts.

cv2.floodFill(thesh, None, seedPoint=(0, 0), newVal=128, loDiff=1, upDiff=1)  # Fill the background in thesh with the value 128 (pixel in the foreground stays 0.

image[thesh == 128] = (0, 0, 255)  # Set all the pixels where thesh=128 to red.

cv2.imwrite('tulips_red_bg.jpg', image)  # Save the output image.

s_ch (канал цвета насыщенности):
enter image description here

thesh после морфологического вскрытия и floodFill:
enter image description here

Выходное изображение:
enter image description here

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