使用python进行图像颜色检测

时间:2010-02-16 05:31:48

标签: 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()

6 个答案:

答案 0 :(得分:12)

Use a PIL (Python Image Library) histogram.在直方图上循环,取像素数乘以像素数的平均值。

答案 1 :(得分:9)

正如其他人所提到的,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对于非常小的图像是可以的,但在大多数情况下可能不起作用。对于较大的图像,必须增加该值。例如,对于400像素* 300像素的图像,1024 * 1024就可以了。

答案 2 :(得分:5)

您应该使用ImageFile类中的PIL Parser从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线。

答案 3 :(得分:0)

您可以使用PIL库的Image模块执行此操作。请参阅:http://effbot.org/imagingbook/image.htm

答案 4 :(得分:0)

您可以使用K-means算法来获取图像的K主色。以下是如何执行此操作的示例:K-means using OpenCV (Python)

答案 5 :(得分:0)

所有答案都讨论了在图像中查找单一颜色的方法,但是知道如何在图像中查找多种颜色始终是有益的。 尤其是在处理分割任务的图像时

让我们为您解释图片

Segmentation Task

很显然,此图片中的每一类对象都有不同的颜色。

让我们编写一个从URL下载图像并将其转换为numpy数组的函数。以这种方式处理图像变得非常容易。

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中获得所有颜色的十六进制代码列表。

让我知道代码是否适用/不适合您:)