Uzyskiwanie dominującego koloru na obrazie?

3

Czy możliwe jest uzyskanie dominującego koloru na obrazie z linii poleceń? Idealnie chciałbym, żeby był z powrotem jako hex lub RGB.

Myślałem, że można to zrobić za pomocą polecenie identyfikacji imagemagick , ale nie widziałem opcji, aby to zrobić w dokumentacji.

Richard
źródło
Czy mógłbyś bardziej szczegółowo określić, co jest dla ciebie dominującym kolorem? 24-bitowy piksel RGB ma 16777216 możliwych wartości kolorów i wątpię, czy znalezienie najbardziej powtarzalnego jest przydatne w jakikolwiek sposób.
gronostaj
Chciałbym zawęzić to do dość małej liczby kolorów ... Nie jestem ekspertem od kolorów, ale szesnaście bezpiecznych kolorów HTML lub nazwy kolorów X11 byłyby idealne. Myślę, że wymagałoby to pewnego rodzaju procesu, takiego jak (i) zmniejszenie przestrzeni kolorów obrazu (ii) utworzenie tabeli pikseli według koloru (iii) odwzorowanie dominującego koloru na najbliższą nazwę koloru. Ale nie mam pojęcia, jak to zrobić!
Richard

Odpowiedzi:

10

Imagemagick's identify -verbose zapewnia tabelę histogramów palet, ale tylko jeśli liczba unikalnych kolorów jest poniżej limitu (1024 w sprawdzonych wersjach, v6.x do v6.8.3).

Zamiast tego możesz po prostu convert " Twój obraz do histogramu , ten wynik nie jest ograniczony liczbą unikalnych kolorów:

convert image.jpg  -format %c -depth 8  histogram:info:histogram_image.txt
sort -n histogram_image.txt | tail -1

Sortowanie wyników numerycznie przez pierwszą kolumnę sortuje według częstotliwości kolorów pikseli. (Częstotliwość określonych kolorowych pikseli może oczywiście nie odpowiadać ludzkiemu postrzeganiu dominującego koloru.)

Jeśli redukujesz kolory, możesz po prostu zaufać convert do zrobić to dla Ciebie według twojego wyboru dithering i / lub posteryzujący . Nawet specjalnie dla web-safe 216:

convert image.png  +dither -remap netscape:  image_websafe.png

Prawdopodobnie zbliżyłbyś się do postrzeganego dominującego koloru poprzez połączenie rozmycia, zmiany rozmiaru i posteryzowania. Nie jest to prosty problem do zdefiniowania i rozwiązania:


Zobacz także poniższy link do dcolors, skrypt, który używa Imagemagick do określenia zestawu dominującego zabarwienie w obrazie wykorzystuje koordynację schematu kolorów pulpitu z wybranym obrazem pulpitu: http://javier.io/blog/en/2015/09/30/using-imagemagick-and-kmeans-to-find-dominant-colors-in-images.html

mr.spuratic
źródło
1
Dzięki - świetna odpowiedź, a pierwsze dwa polecenia działają naprawdę dobrze! Jedno ostatnie pytanie: jak myślisz, jaki jest najlepszy sposób odwzorowania dominującej wartości szesnastkowej na najbliższą wartość bezpieczną? Czy to tylko kwestia arytmetyki heksadecymalnej, czy jest bardziej wyrafinowany sposób?
Richard
Biorąc pod uwagę, że paleta jest tak ograniczona, traktowanie (R, G, B) jako przestrzeni 3d i znalezienie minimalnej odległości euklidesowej do zdefiniowanego koloru prawdopodobnie wystarczy do większości celów. Możesz dostać convert zrobić to dla ciebie, dodając -remap netscape: po -depth 8 w pierwszym poleceniu powyżej.
mr.spuratic