如何遍历直方图以获取图片的颜色? [英] How to loop over histogram to get the color of the picture?

查看:104
本文介绍了如何遍历直方图以获取图片的颜色?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在这个答案关于检测图像的颜色<











$ b $像这样运行直方图:

  class ImageResize(webapp.RequestHandler):
def get(self):
q = HomePage.all()
q.filter(firm_name,noise)
qTable = q.get()
id = qTable.key()。id()
if id:
homepage = HomePage.get_by_id(id)
if主页:
img = images.Image(homepage.thumbnail)
hist = img.histogram( )

然后在IDLE中,对于直方图的每种颜色 hist2 ,我试图得到平均值并除以像素数,但我得到了相同的数字。我做错了什么?

 >>> average_red = float(sum(hist2 [0]))/ len(hist2 [0])
>>> average_red
789.2578125
>>> average_green = float(sum(hist2 [1]))/ len(hist2 [1])$ ​​b $ b>>> average_green
789.2578125
>>> average_blue = float(sum(hist2 [2]))/ len(hist2 [2])
>>> average_blue
789.2578125
>>>

更新

感谢Saxon Druce 答案。以下是我使用的代码:

 >>> def hist_weighed_average(hist):
red_hist = hist [0]
green_hist = hist [1]
blue_hist = hist [2]

red_weighed_sum = float(sum (len(red_hist))))
green_weighed_sum = float(sum(i * green_hist [i] for i in range(len(green_hist))))
(len(blue_hist))))

red_num_pixels = float(sum(red_hist))
green_num_pixels = float(sum(blue_hist [ (green_hist))
blue_num_pixels = float(sum(blue_hist))

red_weighed_average = red_weighed_sum / num_pixels
green_weighed_average = green_weighed_sum / num_pixels
blue_weighed_average = blue_weighed_sum / num_pixels
return red_weighed_average,green_weighed_average,blue_weighed_average
>>> hist = hist3
>>> hist_weighed_average(hist)
(4.4292897797574859,4.8236723583271468,5.2772779015095272)
>>> hist = hist2
>>> hist_weighed_average(hist)
(213.11471417965851,220.01047265528334,214.12880475129919)
>>>


解决方案

假设 hist2 [0] 是红色像素的直方图,那么它是由红色分量索引的像素计数的直方图。这意味着 sum(hist2 [0])总是图像中像素的数量,并且 len(hist2 [0]) 始终为256.对于红色,绿色和蓝色三种颜色,这总会给出相同的答案。



您需要将像素计数(直方图中的值)乘以像素值(列表中的索引),然后将它们相加,以获得加权和。然后除以像素数以得到加权平均值。可能是这样的:

  red_hist = hist2 [0] 
weighted_sum = sum(i * red_hist [i] for我在范围内(len(red_hist)))
num_pixels = sum(red_hist)
weighted_average = weighted_sum / num_pixels


In this answer about detecting the color of an image olooney said that "loop over the histogram and take the average of pixel color weighed by the pixel count".

I ran the histogram like this:

class ImageResize(webapp.RequestHandler):
    def get(self):
        q = HomePage.all()
        q.filter("firm_name", "noise")
        qTable = q.get()
        id = qTable.key().id()
        if id:
            homepage = HomePage.get_by_id(id)
            if homepage:
                img = images.Image(homepage.thumbnail)
                hist = img.histogram()

then in IDLE, for each color of the histogram hist2, I tried to get the average and divided by pixel count, but I get the same number. What am I doing wrong?

>>> average_red = float(sum(hist2[0]))/len(hist2[0])
>>> average_red
789.2578125
>>> average_green = float(sum(hist2[1]))/len(hist2[1])
>>> average_green
789.2578125
>>> average_blue = float(sum(hist2[2]))/len(hist2[2])
>>> average_blue
789.2578125
>>>

Update

Thanks to Saxon Druce for the answer. Here's the code I used:

>>> def hist_weighed_average(hist):
    red_hist = hist[0]
    green_hist = hist[1]
    blue_hist = hist[2]

    red_weighed_sum = float(sum(i * red_hist[i] for i in range(len(red_hist))))
    green_weighed_sum = float(sum(i * green_hist[i] for i in range(len(green_hist))))
    blue_weighed_sum = float(sum(i * blue_hist[i] for i in range(len(blue_hist))))

    red_num_pixels = float(sum(red_hist))
    green_num_pixels = float(sum(green_hist))
    blue_num_pixels = float(sum(blue_hist))

    red_weighed_average = red_weighed_sum / num_pixels
    green_weighed_average = green_weighed_sum / num_pixels
    blue_weighed_average = blue_weighed_sum / num_pixels
    return red_weighed_average, green_weighed_average, blue_weighed_average
>>> hist = hist3
>>> hist_weighed_average(hist)
(4.4292897797574859, 4.8236723583271468, 5.2772779015095272)
>>> hist = hist2
>>> hist_weighed_average(hist)
(213.11471417965851, 220.01047265528334, 214.12880475129919)
>>> 

解决方案

Assuming hist2[0] is the histogram of the red pixels, then it is a histogram of pixel counts indexed by the red component. That means that sum(hist2[0]) is always going to be the number of pixels in the image, and len(hist2[0]) is always going to be 256. This will always give you the same answer, for all three of red, green and blue.

You need to multiply the pixel counts (the values in the histogram) by the pixel values (the index in the list), then add them, to get a weighted sum. Then divide by the number of pixels to get the weighted average. Maybe something like this:

red_hist = hist2[0]
weighted_sum = sum(i * red_hist[i] for i in range(len(red_hist)))
num_pixels = sum(red_hist)
weighted_average = weighted_sum / num_pixels

这篇关于如何遍历直方图以获取图片的颜色?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆