Я буду считать для этого ответа, что im
является 3D список, содержащий [R, G, B]
значения для каждого пикселя в изображении, или, другими словами, что это вид:
im = [ [[a, b, c], [d, e, f]],
[[g, h, i], [j, k, l]] ]
Давайте обращаться ваши вопросы один за другим:
Сначала вы спросили, как сумма каждого пикселя, деленная на три, является средней. Чтобы ответить на это, давайте рассмотрим определение среднего (точнее, среднего арифметического) списка чисел, которое представляет собой «сумму чисел в списке, деленное на количество элементов в списке».
В математических символах, это выглядит так, где a
это имя списка, и n
его длина:
Таким образом, в среднем из списка, который является 3 пунктами долго:
Теперь в этом случае мы сохраняем значение каждого пикселя в виде списка, содержащего данные формы [R, G, B]
. Согласно только что описанной формуле, среднее из трех значений равно их сумме, деленной на их длину. Если применить эту формулу, мы получим:
Теперь для вашего второго вопроса, как код знает, что красный, зеленый и синий значения. Ответ заключается в том, что он знает эти ценности, потому что мы рассказываем, где искать. Когда мы начали, мы определили 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 равным - установить:
И это именно то, что здесь делает код.