Поэтому я разрабатываю несколько программ для редактирования фотографий в python
с использованием PIL
и один из них конвертирует изображение в оттенки серого (я избегаю использования любых функций из PIL
).
Используемый мною алгоритм прост: для каждого пикселя (глубина цвета 24) я вычислил среднее значение R
, G
и B
и установил значения RGB в этом среднем состоянии.
Моя программа создавала полутоновые изображения, которые казались точными, но мне было интересно, использовал ли я правильный алгоритм, и я наткнулся на этот ответ на вопрос, где кажется, что "правильный" алгоритм должен вычислять 0.299 R + 0.587 G + 0.114 B
Я решил сравнить свою программу с этим алгоритмом. Я создал изображение в оттенках серого, используя мою программу, и другую (используя тот же ввод) с веб-сайта в Интернете (верхний результат Google для 'image to grayscale'
.
Моим невооруженным взглядом казалось, что они были точно такими же, и если бы было какое-то изменение, я не мог этого видеть. Тем не менее, я решил использовать этот сайт (верхний результат Google для 'compare two images online'
), чтобы сравнить мои изображения в оттенках серого. Оказалось, что в глубине пикселей они имели небольшие вариации, но ни один из них не был воспринят человеческим глазом на первый взгляд (различия могут быть замечены, но обычно только тогда, когда изображения накладываются друг на друга или переключаются между ними в миллисекундах),
Мои вопросы (первый - главный вопрос):
- Есть ли недостатки в использовании моего "грубого" алгоритма серого?
- У кого-нибудь есть какие-либо входные изображения, где мой алгоритм с оттенками серого создаст видимое изображение, которое будет "правильным"?
- Существуют ли комбинации цветов /RBG, для которых мой алгоритм не будет работать?
Моя ключевая часть кода (при необходимости):
def greyScale(pixelTuple):
return tuple([round(sum(pixelTuple) / 3)] * 3)
"Правильный" алгоритм (который, кажется, сильно весит зеленый):
def greyScale(pixelTuple):
return tuple([round(0.299 * pixelTuple[0] + 0.587 * pixelTuple[1] + 0.114 * pixelTuple[2])] * 3)
Изображение в оттенках серого, созданное моим алгоритмом:
Изображение в оттенках серого, которое является "правильным":
Когда изображения в оттенках серого сравниваются онлайн (выделены красным цветом различия, используя 10% пуха):
Несмотря на различия в выделенных выше пикселях, изображения в серой шкале выше отображаются как почти одинаковые (по крайней мере, для меня).
Кроме того, в отношении моего первого вопроса, если кому-то это интересно, этот сайт сделал некоторый анализ по различным алгоритмам для преобразований в оттенки серого, а также имеет некоторые пользовательские алгоритмы.
EDIT:
В ответ на ответ @Szulat мой алгоритм фактически производит это изображение вместо этого (игнорируйте плохую обрезку, исходное изображение имеет три круга, но мне нужен только первый):
В случае, если люди задаются вопросом, в чем причина преобразования в оттенки серого (так как кажется, что алгоритм зависит от цели), я просто делаю некоторые простые инструменты для редактирования фотографий на python
чтобы у меня был мини-Photoshop, t нужно полагаться на Интернет для применения фильтров и эффектов.
Причина для Bounty: Различные ответы здесь охватывают разные вещи, которые являются релевантными и полезными. Это затрудняет выбор того, какой ответ принять. Я начал щедрость, потому что мне нравятся несколько ответов, перечисленных здесь, но также потому, что было бы хорошо иметь один ответ, который покрывает все, что мне нужно для этого вопроса.