Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何循环直方图以获得图片的颜色?_Python_Google App Engine_Histogram - Fatal编程技术网

Python 如何循环直方图以获得图片的颜色?

Python 如何循环直方图以获得图片的颜色?,python,google-app-engine,histogram,Python,Google App Engine,Histogram,关于检测图像的颜色olooney说“循环直方图,取像素计数加权的像素颜色平均值” 我这样运行柱状图: class ImageResize(webapp.RequestHandler): def get(self): q = HomePage.all() q.filter("firm_name", "noise") qTable = q.get() id = qTable.key().id() if id:

关于检测图像的颜色
olooney
说“循环直方图,取像素计数加权的像素颜色平均值”

我这样运行柱状图:

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()
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
然后在空闲状态下,对于直方图的每种颜色,我试图得到平均值并除以像素计数,但得到的数字相同。我做错了什么

>>> 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
>>>
更新

感谢撒克逊德鲁塞的帮助。以下是我使用的代码:

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

假设
hist2[0]
是红色像素的直方图,则它是由红色分量索引的像素计数的直方图。这意味着
sum(hist2[0])
始终是图像中的像素数,
len(hist2[0])
始终是256。对于红色、绿色和蓝色三种颜色,这将始终为您提供相同的答案

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

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

它是灰度图像吗?@Zeynel:注意,红色、绿色和蓝色像素都是一样的,所以你不需要计算三次。更快的方法是只使用图像的
宽度*高度;我在问题中添加了代码。我如何根据颜色订购图片,有什么建议吗?再次感谢。@Zeynel:这将取决于你的图像是什么样的。您可以尝试将RGB值转换为HSV,然后按H排序。但是,只有当S和V值大致相似时,这才显得合理。例如,示例代码中的这两种颜色是略带蓝色和略带绿色的,因此将分别与其他蓝色和绿色进行排序,但实际上它们看起来像黑色和浅灰色,因此看起来不合适。你也可以尝试从RGB转换为YUV或YCbCr,然后使用Y(类似灰度),如果你的图像是灰色的,这可能会起作用。SaxonDruce:我尝试了其他几种方法,包括将图像减少到1像素和按色调排序,但没有一种真正起作用。最好的方法似乎是先按红色,然后按绿色,再按蓝色对我的查询排序:。虽然这可能是巧合。我想达到这个效果:但在这个编程级别上似乎不可能。再次感谢。