2015-03-20 2 views
0

Мне нужно немного больше проработать над массивами в программировании GUI. Для обработки изображений, я получил следующий фрагмент кода в качестве примера обработки изображений:Программирование/массивы GUI в Python

def grayscale(im): 
    height=len(im) 
    width = len(im[0]) 
    for row in range(height): 
     for col in range(width): 
      average = sum(im[row][col])/3 
      im[row][col]=[average,average,average] 
    return im 

В последней строке перед возвратом кода - что это значит? Предполагается, что код работает через пиксель за пикселем и усредняет значения RGB, чтобы получить значение оттенков серого - как сумма каждого пикселя/3 в среднем? Как код знает, каковы значения красного, синего и зеленого?

ответ

1

Каждый цвет в пикселе определяется вариацией из трех компонентов: красный, зеленый и синий, обычно колеблющийся между 0 и 255, создающий 16 миллионов цветов (255^3).

Тень серого представлена ​​тремя идентичными значениями для красного, зеленого и синего.

Существует несколько способов достижения конверсии оттенков серого, включая быстрый метод «грязного среднего» (см. Другие here).

Поскольку оттенки серого требуют только одного масштаба (от белого до черного), вы можете просто усреднить три компонента с помощью формулы (R + G + B)/3, чтобы сделать новый цвет с этим значением для каждого цветового компонента, создавая тем самым серый оттенок.

1

Я буду считать для этого ответа, что im является 3D список, содержащий [R, G, B] значения для каждого пикселя в изображении, или, другими словами, что это вид:

im = [ [[a, b, c], [d, e, f]], 
     [[g, h, i], [j, k, l]] ] 

Давайте обращаться ваши вопросы один за другим:

Сначала вы спросили, как сумма каждого пикселя, деленная на три, является средней. Чтобы ответить на это, давайте рассмотрим определение среднего (точнее, среднего арифметического) списка чисел, которое представляет собой «сумму чисел в списке, деленное на количество элементов в списке».
В математических символах, это выглядит так, где a это имя списка, и n его длина:
formula
Таким образом, в среднем из списка, который является 3 пунктами долго:
formula
Теперь в этом случае мы сохраняем значение каждого пикселя в виде списка, содержащего данные формы [R, G, B]. Согласно только что описанной формуле, среднее из трех значений равно их сумме, деленной на их длину. Если применить эту формулу, мы получим:

formula

Теперь для вашего второго вопроса, как код знает, что красный, зеленый и синий значения. Ответ заключается в том, что он знает эти ценности, потому что мы рассказываем, где искать. Когда мы начали, мы определили im как 3D-список, содержащий [R, G, B] значений для каждого пикселя. Тот, кто написал код, решил, что лучший способ представить эти данные будет через список, подобный этому, и поэтому они написали весь остальной код так, чтобы полагаться на это представление. Теперь, основываясь на коде, который вы предоставили, мы фактически не можем гарантировать, что значения равны [R, G, B]. Они могут быть [G, R, B], или [B, G, R]. Тем не менее, стандартная практика при работе с цветами заключается в том, чтобы упорядочить их как [R, G, B], и, если только у вас нет конкретной причины думать иначе, это должно быть ваше предположение.Кроме того, для этого конкретного кода не имеет значения, в каком порядке находятся значения, поскольку среднее значение [10, 20, 30] совпадает с средним значением [20, 30, 10] или любой другой перестановкой этих значений.

Наконец, давайте поговорим о том, как найти среднее значение [R, G, B], преобразует изображение в оттенки серого. Нейтральный цвет определяется как любой цвет, для которого R, G и B равны. Белый - нейтральный цвет (R = G = B = 100%), как черный (R = G = B = 0%). То же самое верно для всех оттенков между белым и черным. Другими словами, любой цвет, где R = G = B, будет белым, черным или оттенком серого.

Итак, чтобы преобразовать в оттенки серого, нам просто нужно сопоставить данный пиксель с соответствующим пикселем, где R = G = B. Один из самых простых способов сделать R, G и B равным - установить: formula

И это именно то, что здесь делает код.