Немного неправильный средний цвет. (Np.mean ()) - PullRequest
1 голос
/ 29 сентября 2019

Я написал скрипт, который записывает средний цвет изображения в файле. Но он возвращает бит неправильных значений.

# coding=utf-8

from __future__ import print_function
import cv2, sys, os
import numpy as np

palette = []

if len(sys.argv) < 2:
    print(u'Drag file on me.')
    print(u'(Press Enter to close)',end='')
    raw_input()
    sys.exit()

if not os.path.exists(sys.argv[1]):
    print(u'Invalid file name.')
    print(u'(Press Enter to close)',end='')
    raw_input()
    sys.exit()
for file in sys.argv[1:]:
    im = cv2.imread(file)
    if im is None:
        print(u'The specified file is corrupted or is not a picture.')
        print(u'(Press Enter to close)',end='')
        raw_input()
        sys.exit()

    colors = np.unique(im.reshape(-1, im.shape[2]), axis=0)
    color = np.flip(colors.mean(axis=0,dtype=np.float64).astype(int)).tolist()
    palette.append([color,os.path.basename(file)[:-4]])
palette = np.array(palette)
palette = palette[palette[:,0].argsort(kind='mergesort')]
out = open('palette.txt','w')
out.write(str(palette.tolist()))
out.close()

Пример: (изображение) - в фотошопе и здесь , средний цвет[105, 99, 89], но мой скрипт возвращает [107,100,90]

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Возможно, вы захотите удалить команду unique, чтобы воспроизвести то, что делает JavaScript. Замените его на

colors = im.reshape(-1, im.shape[2])

Разница в том, что вы усредняете нёбо (каждый использованный цвет появляется один раз), а скрипт усредняет изображение (усредняет цвета по мере их появления на изображении).

0 голосов
/ 29 сентября 2019

Измените строку с помощью

colors = np.unique(im.reshape(-1, im.shape[2]), axis=0)

на

colors = im.reshape(-1, im.shape[2])

Для расчета среднего цвета имеет значение, если цветиспользуется более одного раза, поэтому использование np.unique даст неверный результат.

...