Ответ 1
Использовать гистограмму PIL (Библиотека изображений Python). Прокрутите гистограмму и возьмите среднее значение цвета пикселя, взвешенного по количеству пикселей.
После загрузки изображения с сайта мне нужно определить цвет загруженного изображения. Я успешно загрузил изображение, но мне нужно определить цвет соответствующего изображения и сохранить его в названии соответствующего цвета. Используемый код приведен ниже. Расскажите мне, как я могу достичь этого с текущей позиции.
imageurl='http://www.example.com/'
opener1 = urllib2.build_opener()
page1=opener1.open(imageurl)
my_picture=page1.read()
fout = open('images/tony'+image[s], "wb")
fout.write(my_picture)
fout.close()
Использовать гистограмму PIL (Библиотека изображений Python). Прокрутите гистограмму и возьмите среднее значение цвета пикселя, взвешенного по количеству пикселей.
Как упоминалось другими, PIL - это правильная библиотека. Вот функция, открывающая изображение и поиск основного цвета.
def get_main_color(file):
img = Image.open(file)
colors = img.getcolors(256) #put a higher value if there are many colors in your image
max_occurence, most_present = 0, 0
try:
for c in colors:
if c[0] > max_occurence:
(max_occurence, most_present) = c
return most_present
except TypeError:
raise Exception("Too many colors in the image")
Я надеюсь, что это поможет
Обновление: передача 256 в getcolors в порядке для очень маленьких изображений, но может не работать в большинстве случаев. Это значение должно быть увеличено для больших изображений. например, 1024 * 1024 подходит для 400 пикселей * 300 пикселей изображения.
Вы должны использовать PIL Parser из класса ImageFile, чтобы прочитать файл с URL-адреса. Тогда жизнь довольно проста, потому что вы сказали, что все изображение одного цвета. Вот код, который основывается на вашем коде:
import urllib2
import ImageFile
image_url = "http://plainview.files.wordpress.com/2009/06/black.jpg"
opener1 = urllib2.build_opener()
page1=opener1.open(image_url)
p = ImageFile.Parser()
while 1:
s = page1.read(1024)
if not s:
break
p.feed(s)
im = p.close()
r,g,b = im.getpixel((0,0))
fout = open('images/tony'+image[s]+"%d%_d%_d"%(r,g,b), "wb")
fout.write(my_picture)
fout.close()
Это должно добавить красные зеленые и синие значения цвета первого пикселя изображения в конец имени изображения. Я тестировал все до линий fout.
Во всех ответах обсуждаются методы поиска одного цвета на изображении, но всегда полезно знать, как найти несколько цветов на изображении. Особенно, когда вы имеете дело с изображениями задач сегментации.
Давайте возьмем изображение для нашего объяснения
Очевидно, что каждый класс объектов на этом рисунке имеет свой цвет.
Давайте напишем функцию для загрузки изображения с URL-адреса и преобразования его в пустой массив. Таким образом становится очень легко работать с изображениями.
import numpy as np
import cv2
import urllib
from urllib.request import urlopen
import webcolors
import time
def getImageArray(mask):
req = requestObject(mask)
arr = np.asarray(bytearray(req.read()), dtype=np.uint8)
im = cv2.imdecode(arr, -1)
im = im[:, :, :3]
return im
def requestObject(mask):
temp_req = {'status': 403}
retry_counter = 1
while((temp_req['status'] != 200) and (retry_counter <= 10)):
try:
req = urlopen(mask)
temp_req = {"status": 200}
except:
print("Retrying for: ", retry_counter)
temp_req = {"status": 403}
time.sleep(4)
retry_counter = retry_counter + 1
return req
Теперь позвольте получить изображение:
url = '/img/2e3a2f883613d9cc35e15875a7eb399f.jpg'
image = getImageArray(url)
Давайте напишем функцию, чтобы найти все цвета:
def bgr_to_hex(bgr):
rgb =list(bgr)
rgb.reverse()
return webcolors.rgb_to_hex(tuple(rgb))
def FindColors(image):
color_hex = []
for i in image:
for j in i:
j = list(j)
color_hex.append(bgr_to_hex(tuple(j)))
return set(color_hex)
color_list = FindColors(image)
Попробуйте запустить приведенный выше скрипт в своем терминале, и вы получите список шестнадцатеричных кодов для всех цветов в переменной color_list
.
Дайте мне знать, если код работает/не для вас :)
Для этого вы можете использовать модуль изображения библиотеки PIL. См.: http://effbot.org/imagingbook/image.htm.
Вы можете использовать алгоритм K-средних, чтобы получить основные цвета K изображения. Вот пример того, как это сделать: K-означает использование OpenCV (Python)