Phoen1xx
@Phoen1xx

Как в opencv определить цвет изображения?

Здравствуйте. У меня есть несколько изображений с доминирующими на них цветами (например 90% изображения ярко красное), большинство статей в сети легко дают информацию как выделить доминирующий цвет, но он получается всегда разный т.к. изображения имеют немного разную яркость и множество оттенков, как мне превратить кучу оттенков rgb в цвет: "red", "green".

P.S. Пример двумя картинками, и их доминирующие цветами:
26159966_38674.jpg
a2b22acc18b6bb9227550d4e8b30796bcb21058er1-1080-1221v2_hq.jpg
Мне нужно получить просто текст: "reg" и "blue"
  • Вопрос задан
  • 205 просмотров
Решения вопроса 1
Phoen1xx
@Phoen1xx Автор вопроса
Решение оказалось гораздо проще, нужно просто посчитать расстояние между цветами:
https://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D...
Как определить цвет, близкий к цвету из существующего списка (php)?
Нашел на js пример:
https://github.com/dtao/nearest-color
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами
Написано на скорую руку. Адаптируете при необходимости:
import matplotlib.pyplot as plt
%matplotlib inline
import cv2
from PIL import Image, ImageDraw
import numpy

def get_colors(infile, numcolors=10, swatchsize=20, resize=150):

    plt.rcParams['figure.figsize'] = [15, 3]
    f,ax = plt.subplots(1,2)
    
    image = Image.open(infile)
    orig = image.copy()
    image = image.resize((resize, resize))
    result = image.convert('P', palette=Image.ADAPTIVE, colors=numcolors)
    result.putalpha(0)
    colors = result.getcolors(resize*resize)

    pal = Image.new('RGB', (swatchsize*numcolors, swatchsize))
    draw = ImageDraw.Draw(pal)

    posx = 0

    for count, col in sorted(colors, key=lambda x: x[0], reverse=True):
        draw.rectangle([posx, 0, posx+swatchsize, swatchsize], fill=col)
        posx = posx + swatchsize

    img = numpy.asarray(pal)
    del draw
    
    print('File: ', infile)
    for im in sorted(colors, key=lambda x: x[0], reverse=True):
        if im[1].index(max(im[1])) == 0:
            print(im, 'red')
        elif im[1].index(max(im[1])) == 1:
            print(im, 'green')
        elif im[1].index(max(im[1])) == 2:
            print(im, 'blue')

    ax[0].imshow(orig)
    ax[1].imshow(img)

if __name__ == '__main__':
    get_colors('D:\\00\\sample01.jpg', numcolors=1)
    get_colors('D:\\00\\sample02.jpg', numcolors=1)
    get_colors('D:\\00\\sample03.jpg', numcolors=1)

5fd5c6a7ca653162348895.png
Ответ написан
dimonchik2013
@dimonchik2013
совет, который уже дан - ничего не стоит
нормализацией
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы