Определение цвета изображения с помощью Python - PullRequest
18 голосов
/ 16 февраля 2010

После загрузки изображения с сайта мне нужно определить цвет загруженного изображения. Я успешно загрузил изображение, но мне нужно определить цвет соответствующего изображения и сохранить его под именем соответствующего цвета. Используемый код приведен ниже. Скажите, как мне добиться его с текущей позиции.

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()

Ответы [ 6 ]

12 голосов
/ 16 февраля 2010

Используйте гистограмму PIL (Python Image Library). Обведите петлю гистограммы и возьмите среднее значение цвета пикселей, взвешенное по количеству пикселей.

9 голосов
/ 16 февраля 2010

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

6 голосов
/ 16 февраля 2010

Вы должны использовать Parser PIL из класса 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()

Это должно добавить красно-зеленые и синие значения цвета первого пикселя изображения к концу имени изображения. Я проверил все до черты.

0 голосов
/ 07 июля 2019

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

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

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 = 'https://4.bp.blogspot.com/-qeqDYBU1BRk/WggDh_wNvMI/AAAAAAAAYmo/i6hHDVQEZRAT3BG5G20xiOFuxLvb7DyTwCLcBGAs/s1600/frame0.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.

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

0 голосов
/ 13 октября 2016

Вы можете использовать алгоритм K-средних для получения K основных цветов изображения. Вот пример того, как это сделать: K-означает использование OpenCV (Python)

0 голосов
/ 16 февраля 2010

Вы можете использовать модуль Image библиотеки PIL для этого. Смотри: http://effbot.org/imagingbook/image.htm.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...