Я работаю над веб-приложением, которое позволит вам редактировать изображения с использованием цветов, например, раскрасить черно-белое изображение или переключить цвет автомобиля на цветное изображение.
Мой первый подходВыбор цвета - это выборка цвета в RGB, а затем работа оттуда.Проблема в том, что с rgb цветовая вариация настолько велика, что, выбирая похожие оттенки фиолетового на изображении, вы можете в конечном итоге повторно выбрать несколько раз, и при этом у вас останутся маленькие прямоугольники, в которых вы еще не пробовали его.Например, вот исходное изображение:
![enter image description here](https://i.stack.imgur.com/qCsb2.jpg)
С помощью webapp я выбираю небольшую область прямоугольника между изображением для выборки цветов изатем показывая, где цвета совпали ниже
![enter image description here](https://i.stack.imgur.com/VjaI2.png)
, вы можете сказать, что у него есть небольшая область коробки и небольшие пятна снаружи, где цвет совпадает.
Я провел некоторое исследование и обнаружил, что HSV, то есть Hue, Saturation и Value, является более простым способом выбора оттенков цветов.
Таким образом, используя тот же метод, веб-приложение предоставляет интересующую область, я, как обычно, получаюобласть интереса, а затем, если с помощью hsv получить значение оттенка области интереса и использовать его для проверки на изображении, все пиксели с тем же значением оттенка, и это возвращается в качестве новой области выбора, а затем используется для выборки всехэти новые пиксели для цветов.
Это код ниже
def get_hsv_positions(image, positions):
#hsv comes in hue (color of image), saturation and value that's supposed to be how light or dark the color is
hsv_image = image.convert('HSV')
values = []
for pixel in positions:
values.append(hsv_image.getpixel(tuple(pixel)))
hues = set([x[0] for x in values])
hue_matches = []
width, height = image.size
img_width, img_height = 0,0
for _ in range(width * height):
if img_width == width:
img_height += 1
img_width = 0
pixel = hsv_image.getpixel((img_width, img_height))
if pixel[0] in hues:
hue_matches.append((img_width, img_height))
img_width += 1
return hue_matches
def get_color_range(request):
...
#this gets the x,y position on the image of interest to sample colors
cells = []
for item in selection:
pos = get_position(item['position']['left'], item['position']['top'], image.width, image.height, width, height)
item['position']['top'] = pos[1]
item['position']['left'] = pos[0]
scale_grid(item, width, height, image.width, image.height)
cells.extend(get_cells(item))
image = PILImage.open(image_url)
if hsv:
cells = get_hsv_positions(image, cells)
, и именно так он сейчас сэмплирует изображение
![enter image description here](https://i.stack.imgur.com/oVQn9.png)
лучше но нне идеально, как вы можете сказать здесь
Исходное изображение Выборка Цвет кожи
![enter image description here](https://i.stack.imgur.com/TmMbR.jpg)
Выборка с использованием HSV
![enter image description here](https://i.stack.imgur.com/GQggM.png)
Сэмплирование без использования HSV
![enter image description here](https://i.stack.imgur.com/svOUb.png)
Как вы можете сказать, HSV get - это еще несколько небольших тонов, которыепоявляются на изображении в виде маленьких фигур, но не все из них.
Я надеюсь, что кто-то, кто играл с изображениями, может ли это помочь в науке о данных или чем-то еще.
Кроме того, это проект с открытым исходным кодом, который я сделал и работаю в свободное время, поэтому, если вам интересно, вы можете проверить исходный код , вот краткое введение видео о том, как оноработает.Поэтому, если вы хотите внести свой вклад в это, вы знаете каналы :) или используете его бесплатно, все, что вам подходит.