Wykorzystując swój testowy obraz, najczęściej używany kolor ma wartość RGB (1, 1, 1). To jest bardzo czarne, ale nie do końca czarne. Moja odpowiedź korzysta z PIL library, webcolors i hojny pomoc kodu z this odpowiedzi.
from PIL import Image
import webcolors
def closest_color(requested_color):
min_colors = {}
for key, name in webcolors.css3_hex_to_names.items():
r_c, g_c, b_c = webcolors.hex_to_rgb(key)
rd = (r_c - requested_color[0]) ** 2
gd = (g_c - requested_color[1]) ** 2
bd = (b_c - requested_color[2]) ** 2
min_colors[(rd + gd + bd)] = name
return min_colors[min(min_colors.keys())]
def get_color_name(requested_color):
try:
closest_name = actual_name = webcolors.rgb_to_name(requested_color)
except ValueError:
closest_name = closest_color(requested_color)
actual_name = None
return actual_name, closest_name
if __name__ == '__main__':
lt = Image.open('test.gif').convert('RGB').getcolors()
lt.sort(key=lambda tup:tup[0], reverse=True)
actual_name, closest_name = get_color_name(lt[0][4])
print lt[0], actual_name, closest_name
wyjściowa:
(531162, (1, 1, 1)) None black
W tym przypadku, byłbyś zainteresowany zmiennej closest_name
. Pierwszy (lt[0]
) pokazuje najbardziej popularną wartość RGB. To nie ma zdefiniowanej nazwy kolorów internetowej, stąd None
dla actual_name
Objaśnienie:
to otwarcie pliku masz zapewnione, przekształcając go na RGB, a następnie uruchomić getcolors
metodę pil w sprawie Obraz. Wynikiem tego jest lista krotek w formacie (count, RGB_color_value). Następnie sortuję listę (w odwrotnej kolejności). Korzystając z funkcji z innego answer, przekazuję najbardziej powszechną wartość koloru RGB (teraz pierwsza krotka na liście, a RBG to drugi element krotki).
'Załaduj' obraz, wykonaj iterację nad pikselami i zwiększaj licznik za każdym razem, gdy znajdziesz kolor (0,0,0). – Kevin
Wygląda na to, że czarny to (1, 1, 1), więc możesz po prostu sprawdzić, czy wartość pikseli jest mniejsza niż 10 lub coś podobnego. – Matthew
Powinieneś użyć PIL (Python Imaging Library). Oto jak go użyć: http://stackoverflow.com/a/11064935/1612701 –