Подтвердить что ты не робот

Определение цвета изображения с использованием 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()
4b9b3361

Ответ 2

Как упоминалось другими, 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 пикселей изображения.

Ответ 3

Вы должны использовать 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.

Ответ 4

Во всех ответах обсуждаются методы поиска одного цвета на изображении, но всегда полезно знать, как найти несколько цветов на изображении. Особенно, когда вы имеете дело с изображениями задач сегментации.

Давайте возьмем изображение для нашего объяснения

Segmentation Task

Очевидно, что каждый класс объектов на этом рисунке имеет свой цвет.

Давайте напишем функцию для загрузки изображения с 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.

Дайте мне знать, если код работает/не для вас :)