Как зациклить гистограмму, чтобы получить цвет картинки? - PullRequest
1 голос
/ 27 сентября 2011

В этом ответе об обнаружении цвета изображения olooney сказал, что «зацикливается на гистограмме и принимает среднее значение цвета пикселей, взвешенное по количеству пикселей».

Iзапустил гистограмму так:

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

, затем в IDLE, для каждого цвета гистограммы hist2, я попытался получить среднее значение и разделить на количество пикселей, но я получил то же число.Что я делаю не так?

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

1 Ответ

3 голосов
/ 27 сентября 2011

Если предположить, что hist2[0] - это гистограмма красных пикселей, то это гистограмма количества пикселей, проиндексированных красным компонентом. Это означает, что sum(hist2[0]) всегда будет числом пикселей на изображении, а len(hist2[0]) всегда будет 256. Это всегда даст вам один и тот же ответ для всех трех: красного, зеленого и синего.

Вам необходимо умножить количество пикселей (значения в гистограмме) на значения пикселей (индекс в списке), а затем добавить их, чтобы получить взвешенную сумму. Затем разделите на количество пикселей, чтобы получить средневзвешенное значение. Может быть, что-то вроде этого:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...