| Translations Blog |

PNG Clipart

Гамма ошибка в масштабировании изображения

Перевод статьи - Gamma error in picture scaling

Автор(ы) - Эрик Брассер (Eric Brasseur)

Источник оригинальной статьи:

http://www.ericbrasseur.org/gamma.html

Вступление

В большинстве алгоритмов масштабирования фотографий произошла ошибка. Все протестированные программы (август 2007 г.) имели проблемы: Gimp, Adobe Photoshop, CinePaint, Nip2, ImageMagick, GQview, Eye of Gnome, Paint и Krita. Также использовались три разные операционные системы: Linux, Mac OS X и Windows. (Программное обеспечение, у которого нет проблемы, перечислено в главе Решений.) 

Фотографии, которые были масштабированы с этим программным обеспечением, были ухудшены (см. Примеры). Деградация часто слабая, но, вероятно, большинство изображений содержат, по крайней мере, массив, где деградация четко видна. Я предполагаю, что это происходит с первых версий этого программного обеспечения, может быть, 20 лет назад. 

Ниже фотография Его Святейшества Далай-ламы была настроена для использования этой проблемы. Если вы хотите попробовать, уменьшите его на 50%, используя лучшее программное обеспечение. (Если вы не можете загрузить изображение на свой компьютер, щелкнув по нему правой кнопкой мыши, сделайте снимок экрана или загрузите изображение в этом заархивированном файле.) 

 

Далай-лама



Это то, что вы, вероятно, получите, когда изображение масштабируется вашим программным обеспечением: 

 



Сколько вы заплатили за это программное обеспечение? Это масштабирование, выполняемое правильным программным обеспечением, которое, очевидно, показывает то же самое, что и начальное изображение: 

 



Если вы хотите увидеть, как ваш браузер масштабирует изображение, нажмите здесь

Чтобы получить более плавное изображение для TFT-дисплеев, нажмите здесь

Если вы хотите, чтобы процедуры, которые я написал, создавали изображения Далай-ламы: gamma_grayator.tar.gz 

Когда я показал ему приведенные ниже примеры, друг, фотограф, сказал мне, что он заметил эту ошибку в течение долгого времени, и многие его коллеги заметили. Они никогда не могли ни сказать, ни понять это. Это заставляло их терять много времени и вызывало много разочарований. Как насчет цифрового века, сохраняющего информацию? Мой друг говорит мне, что профессиональные аргентинские вычисления не вызывали таких ошибок. Он считает, что проблема в основном связана с тем, что преподаватели фотоискусства в академиях не понимают этого технического пункта. Если бы они это сделали, основные производители программного обеспечения адаптировались бы, потому что был бы мотивированный спрос. Другие люди сообщали, что гамма вызывала у них серьезные проблемы, такие как веб-мастер, столкнувшийся с затемненными миниатюрами изображений, или карикатурист, который не мог правильно обработать свои рисунки. Не только профессионалы жалуются. Это комментарий от здравомыслящего пользователя: «Рисуя на компьютере, используя GIMP и Photoshop, я обнаружил, что результаты часто выглядят слишком темными, но я всегда думал, что просто галлюцинации». 

Технически говоря, проблема заключается в том, что «вычисления выполняются так, как если бы шкала яркостей была линейной, а на самом деле это шкала мощности». В математических терминах: «предполагается, что гамма равна 1,0, тогда как она равна 2,2». Многие фильтры, плагины и скрипты делают ту же ошибку. 

Тем не менее, другим не-гамма-совместимым программным обеспечением являются Paint.NET, Google Picasa, старые версии IrfanView, Python Imaging Library 1.1.6, ITT IDL 7.0, ImageJ 1.40, XNview / NConvert 1.97.5, Opera, Google Chrome, KolourPaint. .. 

Странным случаем может быть ACD Canvas X, работающий в Windows XP SP3: изображение Далай-ламы на экране отображается в правильном масштабе, но когда это изображение было сохранено в формате JPEG, а затем вновь открыто ... оно было серым. 

Некоторое программное обеспечение будет выдавать эти результаты при масштабировании изображения Далай-ламы: 

 

Это было сделано MS Paint в Windows XP. Некоторые веб-браузеры делают то же самое. Изображение также могло быть зеленым или клетчато-зеленым и пурпурным. В большинстве случаев изображение будет менее размытым, чем это. Объяснение состоит в том, что масштабирование не выполняется путем вычисления среднего значения соседних пикселей, а просто путем выбора 1 из 4 пикселей в каждом блоке 2x2 пикселей. Это самый простой и быстрый способ масштабирования изображения, но он часто приводит к очевидным проблемам. Это «понижающая дискретизация без фильтра сглаживания». 
Это было сделано в Photoshop (присмотритесь; небольшие зеленые линии). Последние версии Firefox делают то же самое. Объяснение состоит в том, что использовался вышеупомянутый метод; выбирая 1 из 4 пикселей, но сначала применяя фильтр сглаживания, который размывает изображение и, следовательно, составляет среднее значение из соседних пикселей. Это дает слабые зеленые линии. 
Это то, что выдает SeaMonkey 1.1.17 под Ubuntu Linux 9.04. Старые версии Dillo сделали то же самое. Версия 3.0.4 Dillo корректно масштабирует изображения, что делает его единственным браузером, который я знаю, для этого. (Если вы хотите увидеть, как ваш браузер масштабирует изображение, нажмите здесь.)



С другой стороны, никогда не было гамма-проблем в полиграфии или киноиндустрии. Они определили жесткие и научно обоснованные стандарты и процедуры и воспринимают общедоступные программные инструменты как игрушки. (Обратите внимание, что некоторые из инструментов, упомянутых здесь, дают неверные результаты, когда они используются любителями прямо, но при правильном использовании обученными техниками они ведут себя отлично.) Системы сбора медицинских и научных данных также используют точные протоколы, но пока Могут быть случаи, когда анализ выполняется на системах отображения, которые искажают данные. Это может помешать специалисту сделать оптимальную оценку. 

 

Примеры

Слева - правильное масштабирование картины Сатурна (источник). право ... Сатурн потерял свое внешнее кольцо, когда масштабирование было выполнено с использованием Gimp (до 2.10): 

 

Сатурн правильно масштабируется



Эта милая золотая муха (источник) потеряла серебристый оттенок в глазах при масштабировании с использованием Gimp (до 2.10): 

 



Две картинки выше были уменьшены с огромного размера до миниатюры, что увеличивает урон. Кроме того, мне пришлось уменьшить 20 огромных изображений, чтобы получить те два, где ущерб был очевидным. Это было хорошо видно на большинстве из 20 изображений, но не так сильно, как на этих двух. 

Ниже широко расставлены две чешуйки стрекозы (источник). Эта картина была выбрана потому, что разница между правильным и неправильным масштабированием едва заметна 

 

 

                                                                          



Но ... посмотрите на анимацию ниже, которая постоянно переключается между двумя картинками. Посмотрите, сколько света имеет правильное масштабирование. Зная эту разницу, даже если вы ее не заметите, вы принимаете это? 

 



Чтобы сравнить неправильное и правильное масштабирование фотографии Кингс-Крик в национальном парке Лассен, нажмите здесь. Посмотрите на заголовок окна, чтобы узнать, какое масштабирование правильное (или, проще говоря, правильное изображение - самое яркое). (источник

Ошибка появляется отчетливо при масштабировании чистого изображения жука. Чтобы сравнить неправильное масштабирование 1: 4, выполненное с помощью Gimp (до 2.10), с правильным масштабированием, выполненным с помощью написанной мной подпрограммы на C ++, вы можете щелкнуть здесь. (источник) (холст картины был уменьшен с 1600 x 1067 до 1600 x 1064 перед масштабированием) 

А как насчет рисунков? Чтобы увидеть неправильное и правильное масштабирование детали из «Пантомимы» Д.Х. Фристона, вы можете нажать здесь. (источник

А как насчет научных образов? Радарный обзор северной полярной области Титана является одним из выдающихся достижений миссии Кассини-Гюйгенса. Страница www.nasa.gov/mission_pages/cassini/multimedia/pia10008.html показывает это представление и дает ссылку на картинку в полном разрешении. Чтобы сравнить изображение на странице с правильным масштабированием изображения в полном разрешении, нажмите здесь. (Для этого изображения я сжал правильное масштабирование примерно до того же размера, что и изображение на веб-странице НАСА.) (Это не означает, что ученые, работающие над изображением, допустили какую-либо ошибку. Ошибка была сделана из-за них, когда изображение было опубликовано на веб-сайте НАСА.) 

А как насчет ваших праздничных фотографий? Следующий пример был вырезан из панорамы Extersteine. Он был масштабирован до 1: 4, а затем уменьшен до 4: 1 в виде плиток, чтобы вы могли лучше сравнить оригинал с масштабированными изображениями. Для сравнения нажмите здесь. Вы должны отступить на несколько метров от экрана, достаточно, чтобы больше не видеть разницу между исходным изображением и правильным масштабированием. Затем нажмите назад и вперед между оригинальным и неправильным масштабированием.Может быть, попросить кого-нибудь нажать для вас. (Нажав на изображение, вы будете перемещаться по изображениям.) Если у вас нет никого под рукой и беспроводной мыши, для автоматического переключения между изображениями с задержкой в ​​2 секунды нажмите здесь, затем нажмите на изображение или по ссылкам выше, чтобы переключиться между двумя сравнениями. (источник

Контрпример? Эта мирная фотография северо-западного Афганистана масштабируется практически до одной и той же фотографии, независимо от используемого программного обеспечения: нажмите здесь. (источник

Боковой намек на то, что есть проблема? Я измерил 1:64 фотографию макароны из Барбари в Гибралтаре.  , Есть два способа масштабирования изображения 1:64. Либо вы масштабируете его непосредственно 1:64 за один шаг, либо вы масштабируете его 1: 2 шесть раз. Результат должен быть таким же ... Используя мою подпрограмму C ++, результат действительно такой же. Но прямо используя ImageMagick ... Для сравнения масштабированных изображений нажмите здесь. (Вы можете использовать свое собственное программное обеспечение, чтобы уменьшить фотографию 1:64 двумя способами и сравнить ...) (источник

Смешение? Эти два примера от Сэма Ховекара показывают, как стандартное программное обеспечение смешивается с гаммой и как процедуры, написанные Сэмом, делают это правильно: пример 1пример 2

А как насчет простого объединения изображений? Томас Трегер прислал три фотографии ниже. Первые два показывают слияние между горизонтальным и вертикальным градиентом; (  +  ) / 2 =  , Первый показывает правильное слияние. Второй был сделан без линеаризации. Третье изображение показывает разницу между двумя изображениями, что означает, что ошибка хуже. Если вы хотите анимированное сравнение двух слияний, нажмите здесь . Для получения исходного кода на Python, нажмите здесь

 

 

Фор-объяснение

Кажется, почти никто не понимает объяснения в следующей главе. Вот я и подумал об этой аналогии, чтобы ввести тему: 

Военное судно несет 8 видов пушечных ядер. Каждый тип имеет номер от 1 до 8 : 
 

Тип  Описание  Вес 
деревянное пушечное ядро ​​для упражнений 
деревянный с радиоизлучателем  1,1 
деревянный, обмотанный медью  1,5 
голое алюминиевое пушечное ядро  2,9 
алюминий, обмотанный медью  3,1 
полое железо пушечное ядро  3,7 
пушечное ядро ​​с полым свинцом  6,2 
ведущий пушечное ядро 


По некоторому совпадению, пушечные ядра типа 1 имеют вес 1 килограмм. Пушечные ядра типа 8 имеют вес 8 кг. Почему бы и нет ... Но это не относится к другим типам. Тип 5 , например, имеет вес 3,1 кг. 

Очень важно учитывать каждый пушечный яд, покидающий арсенал. Особенно это необходимо для расчета веса того, что осталось в арсенале. Это жизненно важно для поддержания уровня корабля! 

Если одно пушечное ядро ​​типа 1 покинуло арсенал, вместе с тремя пушечными ядрами типа 2 и двумя пушечными ядрами типа 6 , каков вес, который покинул арсенал? Вы обязательно сделаете это вычисление: 

1 х 1 кг + 3 х 1,1 кг + 2 х 3,7 кг = 11,7 кг 

Однажды корабль затонул, и было проведено военное расследование. Они нашли причину неправильной оценки веса, оставшегося в арсенале. Просто сотрудник, ответственный за учет, сделал следующие вычисления: 

1 х 1 + 3 х 2 + 2 х 6 = 19 "кг" 

 

Объяснение

Рассмотрим следующую тестовую картину: 

 



Он состоит из двух рядов из четырех серых квадратов. Отойдите от экрана, чтобы больше не видеть шашки и полосы, а просто серые квадраты. Или наполовину закрой глаза. Если вы используете калиброванную систему отображения, все восемь квадратов отображаются одинаково серым. (Под «системой отображения» я подразумеваю всю цепочку: программное обеспечение дисплея ->операционная система -> графический драйвер -> графическая карта -> монитор. Если один из элементов цепочки выходит из строя, все готово, если другой элемент цепочки не может быть настроенным на компенсацию.) 

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

Если вы используете недорогой TFT-дисплей, третий столбец из двух квадратов может иметь голубоватый оттенок с очень отличной яркостью от других квадратов, и эта яркость также сильно меняется, когда вы двигаете головой вверх и вниз. Это проблемы с гаммой и цветом, которые частично связаны с технологией ЖК-дисплея и частично разработаны с целью повышения яркости ради качества дисплея. С этими проблемами гамма-излучения можно частично справиться с помощью калибровочного оборудования и / или программного обеспечения. (Я использую xcalib и это изображение, чтобы получить приблизительно правильное изображение, уменьшая гамму синего канала.) (Если вам нужны калибровочные изображения, лучше используйте изображения, представленные на этом веб-сайте: www.lagom.nl/lcd-test. Они были сделаны для этой цели, и изображения в этом тексте имеют небольшую ошибку.) 

Это тестовая картинка, уменьшенная на 1:2 моей подпрограммой C ++: 

 



Второй столбец квадратов был уменьшен до правильного оттенка серого. Восемь квадратов продолжают показывать один и тот же серый. 

Это то же самое сокращение 1: 2, которое выполняется текущим стандартным программным обеспечением: 

 



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

Почему второй столбец потемнел? Проблема заключается в гамме. Объяснение следует. 

Справедливо сказать, что в обычной компьютерной системе оттенки серого пронумерованы от 0 до 255. Это составляет 256 оттенков.Тень 0 должен быть абсолютно черного цвета. Тень 255 должен быть самым ярким белым. Все оттенки серого промежуточные.Оттенок 1 немного ярче, чем черный. Тень 60 темно-серый. Оттенок 170 - средний серый. Тень 230 - светло-серый. Эта таблица должна показать эти серые: 

 

0 ####
1 ####
60 ####
170 ####
230 ####
255 ####

 


На этом рисунке показаны все 256 оттенков, от 0 до 255: 

 

 

 



255, деленное на 2, равно 127. Сначала вы подумали, что серый номер 127 имеет половину яркости серого числа 255 (= белый). Это будет «линейный» масштаб. Фактически, серый цвет, который показывает половину яркости 255, является серым числом 187. Это связано с используемой шкалой «мощности». 

Если вы разбираетесь в физике или электронике, следующая таблица показывает яркость некоторых чисел серого в линейной шкале и в используемой шкале мощности. Я сделал диапазон яркости от 0 до 255, чтобы сделать вещи более очевидными. Затем белый пиксель и экран имеют яркость, скажем, 255 мкВт (микроватт). Как бы то ни было ... но одно можно сказать наверняка: пиксель серого числа 128 имеет яркость 55,98 мкВт: 
 

  шкалы яркости 
число 

линейная шкала 

шкала мощности 
0.0  0,000 
32  32,0  3,683 
64  64,0  13,074 
96  96,0  29,827 
128  128,0  55,044 
160  160,0  89,641 
187  186,0  126,718 
192  192,0  134,414 
224  224,0  190,078 
255  255,0  255,000 



Это точно такая же таблица, но с яркостью, выраженной в диапазоне от 0 до 1: 
 

 

  шкалы яркости 
число 

линейная шкала 

шкала мощности 
0,0000  0,0000 
32  0,1255  0,0144 
64  0,2510  0,0513 
96  0,3765  0,1170 
128  0,5020  0,2159 
160  0,6275  0,3515 
186  0,7294  0,4969 
192  0,7529  0,5271 
224  0,8784  0,7454 
255  1,0000  1,0000 




Почему такая странность? Зачем использовать власть? Этот умный технический выбор был сделан, чтобы наилучшим образом использовать узкое количество из 256 чисел. Если бы шкала была линейной, на рисунке ниже показано, каким было бы серое число 1.Он показан в окружении серого числа 0 (= черная смола). Если он не отображается должным образом, значит, ваш дисплей неточный;на TFT, возможно, двигайте головой вверх и вниз, а на ЭЛТ, возможно, поворачивайте с яркостью и контрастностью экрана, чтобы четко показать более яркий центральный квадрат: 

 



Это серый номер 1 в линейной шкале, уже довольно яркий темно-серый. Но благодаря шкале мощности, более 20 оттенков серого существует между черным и темно-серым, показанным выше. На рисунке ниже показаны серые от серого 0 до серого 28: 

 



И наоборот, в линейном масштабе оттенки, близкие к белому, казались бы одинаковыми; ярко-белый. Это было бы пустой тратой.Используя шкалу мощности, серый номер 254 значительно тусклее, чем номер 255. Разница слабая, но полезная. На следующем рисунке показаны шесть квадратов с оттенками 250, 251, 252, 253, 254 и 255. Тень 250 слева заметно ярче, чем тень 255 справа. В линейной системе отображения вы никогда бы не смогли заметить разницу между шестью оттенками: 

 



Это все, чтобы объяснить, что серая цифра 127 не означает, что яркость вдвое меньше, чем у числа 255. Серая цифра 127 означает, что мощность света, излучаемого экраном, должна составлять 21% от мощности яркого белого. И наоборот, количество серых, которые просят 50% мощности, равно 187. 

Предположим, что квадрат размером 2x2 пикселя состоит из двух пикселей высотой черного и двух пикселей ярко-белого цвета. На рисунке ниже показан такой квадрат из четырех пикселей, увеличенный в 64 раза: 

 



Что произойдет, если мы уменьшим картинку 1: 2? Эти четыре пикселя сократились до одного пикселя: 

 



Предполагается, что этот серый пиксель имеет ту же яркость, что и общий результат предыдущих четырех пикселей. Эти четыре пикселя имеют два оттенка черного и два ярко-белого цвета, их смесь дает 50% энергии ярко-белого цвета. Это серый номер 187. 

Ошибка многих алгоритмов масштабирования заключается в том, что вычисляется среднее значение чисел, а не их яркость. Это дает 127 или 128, что показывает 21% мощности света, что является грубой ошибкой. Эта ошибка также возникает при увеличении размера изображения (я не проверял это). Независимо от яркости пикселей, которые объединяются или расширяются, ошибка допускается и приводит к более или менее значительным повреждениям. 

Некоторые изображения, такие как нечеткие фотографии, почти не ухудшаются из-за этой ошибки. Резкие картинки с крошечными контрастными деталями довольно повреждены. 

Джонатан Кэрролл прислал эту картину с двумя размытыми шкалами серого, которые позволяют проверить проблему на всем диапазоне яркости. Изображение должно отображаться 1: 1. Средняя шкала выравнивает оттенки по номерам от 0 до 255 по порядку.Тени в середине - это номер 127 и номер 128. Две размытые шкалы состоят только из полностью белых и полностью черных пикселей.Тем не менее, верхняя шкала сделана с учетом правильной формулы гаммы и гарантирует, что средняя яркость будет такой же, как в средней шкале. Это означает, что в середине шкалы находятся не 50% белых, а 50% черных пикселей. Нижняя шкала, напротив, использует 50% белых и 50% черных пикселей в середине, что, очевидно, ошибочно. Если размер изображения будет уменьшен правильно, верхняя и средняя шкалы будут выглядеть одинаково. 

 

Формулы: гамма и sRGB 


Если вы разбираетесь в физике или математике, вы теперь удивляетесь, какая именно формула мощности используется. Ну, есть два ответа. Когда я впервые написал этот текст, я использовал упрощенную формулу гаммы, показанную ниже, где 2.2 - гамма. Диапазон сигнала и мощности от 0 до 1: 

 

гамма 2,2

 


На самом деле, формула, которая используется для обычного кодирования и декодирования изображений с помощью качественного программного обеспечения, приведена ниже. Он определяет «цветовое пространство sRGB»: 

 

формула преобразования sRGB



На приведенном ниже графике показан результат точной формулы sRGB красным цветом, а под результатом простой гамма-формулы зеленым цветом: 

 

кривые sRGB и гамма



Не обманывайтесь тем фактом, что кривые кажутся почти идентичными. Серый номер 1 в 60 раз ярче от sRGB, чем от простой гамма-кривой. Серый номер 8 в 5 раз ярче. В большинстве случаев это не будет иметь заметных различий, но может, например, при обработке очень темного изображения. 

Ниже приведены формулы и их обратные ссылки в Python. Последние строки скрипта производят данные для второй таблицы в предыдущей главе: 

#! /usr/bin/python

from math import *

def sRGB_to_linear (s) :
   a = 0.055
   if s <= 0.04045 :
      return s / 12.92
   else :
      return ( (s+a) / (1+a) ) ** 2.4

def linear_to_sRGB (s) :
   a = 0.055
   if s <= 0.0031308 :
      return 12.92 * s
   else :
      return (1+a) * s**(1/2.4) - a

def gamma_to_linear (s) :
   return s ** 2.2

def linear_to_gamma (s) :
   return s ** (1/2.2)
 

for x in (0, 32, 64, 96, 128, 160, 187, 192, 224, 255) :
   s = x / 255.0
   print x, s, sRGB_to_linear (s)
 

Вполне допустимо использовать любую другую формулу для кодирования изображения или вообще никакой формулы ... Но тогда что-то где-то должно сказать или подразумевать, что изображение должно обрабатываться по-другому. Либо формат изображения подразумевает это, либо кодировка изображения содержит эту информацию, либо * вы * знаете ее, и вы навязываете ее программному обеспечению каждый раз, когда обрабатываете изображение. Или, возможно, поведение программного обеспечения по умолчанию намеренно предполагает отсутствие или предполагаемую кодировку. Как бы то ни было ... Пока все в порядке, вычисления выполняются для правильных значений силы света каждого пикселя. 

 

Цвета

А как насчет цветов? Обычные цветные картинки состоят из трех основных цветов: красного, зеленого и синего. Каждый пиксель обычно состоит из трех чисел: 

0 красный означает отсутствие красного, 255 красный означает 100% красного. И так далее для каждого основного цвета. Таким образом, смешивая количество каждого из трех основных цветов, создаются все цвета, отображаемые на вашем экране (только высококачественные экраны действительно отображают полную палитру ...) 

Эти три величины основных цветов используют точно такую ​​же шкалу мощности, как описано выше для серых. Следовательно, цветные шашки или полосы подвергаются такой же деградации из-за большого количества программ для масштабирования. Это не просто вопрос яркости, как для серых. Если массив изображения обычно состоит из мелких деталей одного основного цвета и плоских другого основного цвета, цвет деталей и общий цвет массива резко изменятся. 

Последующие тестовые изображения лучше всего просматривать на ЭЛТ-дисплее или качественном TFT-мониторе. Недорогие TFT-дисплеи или ноутбуки будут показывать бессмысленные цвета, если вы не откалибруете их, глядя на них под совершенно перпендикулярным углом. 

На рисунке ниже показаны шесть цветных квадратов. Левый и правый квадраты в одном ряду должны выглядеть одинаково на вашем дисплее (если вы отступите или наполовину закроете глаза). По крайней мере, они должны иметь довольно близкий цвет. Если у вас TFT-дисплей, двигайте головой вверх и вниз и найдите положение, в котором цвета лучше всего соответствуют: 

 



Теперь это результат уменьшения картинки 1: 2 с помощью правильного алгоритма и общепринятого программного обеспечения.Угадай, какая из них хорошая 

 

                   



Следующая тестовая картинка состоит из 3 х 3 серых квадратов. Центральный столбец выполнен из однородных серых пикселей с яркостью 50% (серый номер 186). Шесть квадратов по бокам сделаны из полос цветов, чей общий результат должен показывать ту же яркость 50% серого. Скорее всего, на вашем экране шесть квадратов будут отображать слабую окраску. Чем точнее ваша система отображения, тем меньше цветных квадратов. Если у вас есть TFT-дисплей ноутбука, как у меня, просто наклоните его или двигайте головой вверх и вниз, чтобы увидеть яркие цвета. В середине поля должны быть близки к серому (цвета дополняют друг друга: если вы двигаетесь в одном направлении, нижний левый квадрат становится желтым, а в другом - синим; между ними - серый): 

 



Уменьшено 1:2: 

 

                       



Я потратил два часа на настройку следующего, но мне просто нравится результат. Если вы используете TFT-дисплей, и большое тестовое изображение показывает, как неправильно масштабированное изображение вниз, направьте голову вниз. Чем лучше положение вашей головы, тем больше большое тестовое изображение должно выглядеть как плоская серая полоса (как ее правильно масштабированная копия, внизу слева): 

 



                       



В следующем примере масштабирование не выполняется, а выполняется преобразование цветного изображения в изображение в градациях серого. Так сказать, он отображает цветной фильм на черно-белом телевизоре. Квадрат внизу должен быть равномерно серым. Два маленьких квадрата в центре должны показывать тот же серый цвет, что и остальные, но они делают это, смешивая цветные пиксели зеленого и пурпурного (  и  ). Верхний левый квадрат предназначен для качественных TFT-дисплеев, а нижний правый - для ЭЛТ-дисплеев. (Перемещайте голову вверх и вниз, если у вас стандартный TFT-дисплей, а маленькие квадраты выглядят слишком яркими или слишком темными.) Таким образом, он выглядит серым, но это цветное изображение, поскольку содержит ярко окрашенные пиксели: 

 



Давайте преобразуем эту картинку в оттенки серого. Ниже приводится то, что дает мое программное обеспечение. Два маленьких квадрата, ранее сделанные из цветов, можно различить, если присмотреться, но общий результат состоит в том, что вся картинка остается в одном и том же сером, что является логичным и желательным результатом: 

 



Это преобразование в оттенки серого, выполненное стандартным текущим программным обеспечением: 

 

 

Яркость, контрастность и другие фильтры 

Сначала я подумал, что фильтры яркости и контрастности тоже допустили гамма-ошибку. Затем я узнал и понял, что эти фильтры довольно рыхлые по сути. Их принцип датируется временем, когда их электронный аналог в ранних телевизорах играл прямо с гамма-кривой. То, что в настоящее время называют «яркостью» или «контрастом», может быть почти любым, поэтому трудно представить, что одна реализация имеет неправильную гамму, поскольку реализацию в целом можно рассматривать как неправильную. 
 

Яркость

В Gimp (тестирование до версии 2.10) настройка яркости представляет собой простой алгоритм, который пытается сохранить изображение. Это не имеет ничего общего с настройкой яркости телевизоров. Это также не имеет физического обоснования. Это просто выбор, который увеличивает общую яркость и радует глаз. Его принцип очень прост: скажем, яркость увеличена, а серый 0 становится серым 40. Серый 255 останется серым 255. Все промежуточные серые будут увеличивать значение в диапазоне от 0 до 40. Серый 128 увеличится на 20 ... 

В CinePaint настройка яркости соответствует системе, используемой в телевизорах. Это добавляет то же значение к номерам каждого оттенка серого. Скажем, 0 становится 40, затем 30 становится 70, 200 становится 240 ... просто добавьте 40 ко всем. Мне это показалось еретическим и упрощенным, но на самом деле именно так ведут себя телевизоры по той же причине электронной простоты. Все же есть проблема для цветных изображений. CinePaint сгибает цвета для достижения иллюзии высокой яркости.Действительно, телевизор может довести яркость до предела и сохранить цвета. CinePaint, напротив, ограничен тем, что каждый первичный цветовой канал имеет максимум 255. Чтобы увеличить яркость, когда один первичный канал уже находится на 255, они выбирают увеличение других каналов. Чтобы предотвратить видимый переход, когда один цвет достигает 255, трюк начинается уже раньше ... Опять же, это просто выбор, который отвечает потребностям. Усовершенствования в кодировании изображений позволят избежать подобных уловок. 

Первая проблема, которую я имею с этими настройками яркости, состоит в том, что они зависят от используемой гаммы. Они не дадут одинакового результата на изображении с гаммой 1,8 и изображением с гаммой 2,2. 

Вторая проблема заключается в том, что все эти алгоритмы разные. Нормально, что фильтр яркости в разных программах ведет себя по-другому. 

Недостаток фильтра яркости в Gimp (тестирование до 2.10) заключается в том, что он сам по себе необратим. Вы не можете обратить эффект увеличения яркости на уменьшение. 

У меня нет прямых возражений против этих фильтров. Просто я верю, что каждый из них должен получить свое имя. То, как они работают, должно быть четко объяснено. Например, почти никто не знает, что означает их параметр. И они должны быть доступны в любом программном обеспечении со своими именами. 

Должен быть сформулирован более «абсолютный» набор фильтров яркости и контраста, независимый от гаммы и с простыми и осмысленными физическими интерпретациями. Я написал два разных фильтра «яркости», которые имеют эти особенности и имеют некоторые преимущества при использовании. Например, они лучше раскрывают детали на фотографиях. 

Способ кодирования изображений также должен быть изменен, чтобы обеспечить большую свободу и безопасность при использовании фильтров. Например, я конвертировал фотографию в 32-битную кодировку с плавающей точкой в ​​CinePaint, затем установил максимальную яркость, а затем снова повернул ее на нормальную яркость. Картина была глубоко повреждена. Это логично, но безумно. Используя адекватное высокоточное кодирование, я должен был вернуться к тому же изображению. 
 

Контрастировать

В CinePaint контрастный фильтр действительно следует принципу контрастности телевизора. Но только принцип. Большая разница в том, что телевизор умножает сигнал, начиная с черной точки. Скажем, вы удваиваете контраст, затем серый номер 0 остается 0, 1 становится 2, 7 становится 14 и так далее. CinePaint применяет то же умножение, но использует серый номер 127 в качестве галлюцинаторной черной точки. Таким образом, 127 остается 127, 128 становится 129, 134 становится 141 ... и 126 становится 125, 120 становится 113. Этот выбор имеет смысл для цифровой фотографии. За исключением того факта, что «номер черной точки» должен был настраиваться пользователем. И, пожалуйста, объясните мне, почему я должен был ввести коэффициент контрастности 0,5, чтобы получить умножение около 2. Все это наблюдалось с использованием изображения в градациях серого, я пока не знаю, как обрабатываются цвета. 
 

Гамма и экспозиция

В CinePaint гамма-фильтр корректен (проверено на изображении в градациях серого). Я был просто озадачен тем фактом, что он фактически вычисляет инверсию гаммы, которую вы вводите ... Чтобы применить гамму 2,2, мне нужно было набрать 0,4545 ... Но фильтр экспозиции, доступный в том же диалоговом окне, делает ошибка. Принцип работы фильтра экспозиции: «Что, если фотограф выставил датчик камеры, скажем, в два раза дольше?» Вы получаете более яркую картинку ... В CinePaint серый номер 0 остается 0, серый номер 64 становится 128, а серый номер 128 становится 255. Как если бы это была линейная шкала ... Неправильно ... Еще ... это Точная реализация контрастного фильтра телевизора! Все перепутано ... И, кстати, почему я должен ввести параметр фильтра экспозиции 1, чтобы получить экспозицию (неправильно), умноженную на 2? 
 

Другие

Множество других фильтров тоже допускают ошибку. Например, ниже изображение Далай-ламы было просто размыто немного (размытие по Гауссу, радиус 2). Не гамма-совместимый слева, гамма-совместимый справа: 

 

        


 

Другие виды программного обеспечения и системы вывода

Программное обеспечение для векторного рисования, такое как OpenOffice Draw и Inkscape, предлагает "50%" серого. Вы правильно догадались: это серый номер 127 (на самом деле 128). В этом случае проблема менее важна. Отобразятся оттенки, и вы выбираете тот, который соответствует вашим чувствам. В любом случае, держу пари, разработчики подумали, что у 50% серого светимость составляет 50%. Алгоритмы растрового масштабирования и градиента, используемые этим программным обеспечением, несомненно, также допускают гамма-ошибку. 

При печати этой страницы на черно-белом лазерном принтере я получил это для первого тестового изображения. Я постараюсь сделать более надежную фотографию или отсканировать, в любом случае очевидно, что есть серьезные проблемы. Я думаю, что гамма была вычислена правильно. Проблемы возникают из-за факта, симметричного проблеме, вызванной ЭЛТ-дисплеями. На ЭЛТ белые пиксели будут кровоточить в боковом направлении. На этом листе бумаги черные чернила лазерного принтера растеклись во всех направлениях. Вот почему мелко клетчатый квадрат стал очень темным (симметрично, он становится очень ярким на ЭЛТ). В любом случае это должно было быть компенсировано в драйвере принтера (кстати, как должна делать электроника ЭЛТ-дисплеев): 
 


Друг сказал мне, что программное обеспечение PhotoPrint делает ошибку с гаммой. Он не печатает тестовые изображения этого текста правильно. 

 

Последствия

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

Я пытался проверить, как музеи масштабируют фотографии, показанные на их веб-сайтах. В одном музее Гуггенхайма используется алгоритм, который придает подобие «пластического» взгляда масштабированным изображениям. Картинки закодированы в высоком качестве, но, поскольку они преобразуются, чтобы получить этот «красивый» пластиковый вид, я не могу сравнить. В музее Лувр используется стандартный алгоритм масштабирования, который допускает ошибку. Но картинки кодируются в низком качестве JPEG, что наносит еще больший ущерб, чем гамма-ошибка. Друг, который занимается этим бизнесом, смеялся надо мной и напомнил мне, что музеям просто нет дела до правильных репродукций. Только некоторые специализированные предприятия осуществляют деятельность по использованию высоких технологий для производства надежных репродукций. 

Я пытался сделать то же самое на сайтах НАСА. На самом деле я не мог правильно сравнить изображения, потому что миниатюры внутри текстовых страниц, кажется, сделаны с использованием очень грубых графических инструментов. Ошибки намного важнее той, которую я изучаю. Теперь эти миниатюры не претендуют на научную точность и являются точным представлением того, на что они ссылаются. Поэтому я начал тестировать большие научные изображения, которые НАСА делает доступными для общественности через свои серверы. Чаще всего картины доступны в двух и более масштабах. Все масштабированные версии, которые я тестировал, имели проблему ... Эти масштабированные изображения никогда не предназначались для точных научных исследований, и для многих из них деградация едва заметна. Кроме того, всегда предлагается оригинальная большая картинка, и она также доступна в высококачественном формате TIFF ... Если вам нужно качество, вы его получите. В любом случае мне стало немного жаль. 

А как насчет ваших фотографий? Вы хранили свои семейные фотографии в их оригинальных файлах или вы масштабировали их, вы что-то настроили и выбросили оригинал? Сколько астрономов-любителей полагаются на неточное программное обеспечение для обработки своих фотографий?

 

Решения 

Отправить письмо авторам вашего программного обеспечения

Скажите им, что вам требуется правильная обработка цветового пространства. 
 

Используйте правильное программное обеспечение

Некоторые отзывы указывают на то, что Mac OS X 10.6 теперь полностью совместима с sRGB. Его библиотека системы обработки изображений оказалась правильной, например, с помощью приложения Core Image Fun House. Идея заключается в том, что * любое * программное обеспечение, работающее под Mac OS X 10.6, например Pixelmator, будет правильно обрабатывать изображения, просто потому, что Mac OS X будет правильно их обрабатывать. (Для этого требуется, чтобы программное обеспечение использовало системную библиотеку ... Например, команда sips в Mac OS X 10.6 по-прежнему не масштабируется правильно, что означает, что она масштабирует изображение самостоятельно (неправильно).) Еще одна обратная связь показал, что Mac OS X не стала совместимой ... Я не смог разобраться с этим. Будь осторожен... 

Следующее программное обеспечение, как сообщается, линеаризует изображения правильно, прежде чем работать с ними. Некоторые из них были гамма-совместимыми еще до того, как я написал этот текст, а некоторые были улучшены после того, как его авторы прочли его ... Имейте в виду, что этот список не очень прочен. Например, одно программное обеспечение может быть сообщено как правильное, поскольку оно использовалось в Mac OS X 10.6. Поэтому, если вы используете предыдущую версию Mac OS X ... Кроме того, о некоторых программах сообщалось, что они корректны, поскольку было * возможно * выполнять правильные операции над изображениями. Тем не менее, тупые операции с изображениями приведут к неверным результатам ... Некоторое программное обеспечение будет показывать неправильные масштабированные предварительные просмотры, но окончательное изображение будет в любом случае правильным ... Некоторое программное обеспечение будет делать все правильно, если вы выполните простые тесты с ними, но когда вы начнете работать и, например, вырезать и вставлять изображения из другого программного обеспечения, операция с этими изображениями все еще может быть неправильной ... (без возможности определить, какое из двух программ отвечает за ...) 


Это программное обеспечение будет называться «действительно хорошим», потому что оно позволяет вам загружать изображение, масштабировать и сохранять его обратно, не беспокоясь о цветовом пространстве, гамме или кодировании. Некоторые из таких программ преобразуют изображение в огромное 16-битное или 32-битное изображение глубиной в ОЗУ ... некоторые другие сохраняют изображение в 8-битном, что требует гораздо меньше ОЗУ, но декодируют его в 16 или 32-битный линейный на лету, когда масштабирование выполнено, и сохраните его обратно в кодированном виде в 8 бит, что требует большей мощности процессора ... 

 

Используйте программное обеспечение правильно

Некоторое программное обеспечение позволяет вам получить правильную гамма-обработку, если вы об этом попросите. В некоторых случаях программное обеспечение довольно дорогое и предназначено для обычных фотографий. Тогда тот факт, что изображения обрабатываются неправильно по умолчанию, является позором. В других случаях программное обеспечение всегда предназначалось для использования обученными специалистами. Тогда, ну ... ты должен знать инструменты своей профессии ... 

Такие программы: 


Ключ в том, что вам сначала нужно преобразовать изображение в одну из следующих кодировок (вы легко найдете это в меню программного обеспечения): 


При условии, что изображение теперь выражено в кодировке линейного масштаба с достаточной глубиной, каждое вычисление на изображении будет правильным. 

Позже вы можете преобразовать изображение обратно в sRGB. (Это автоматически, если вы сохраняете изображение, скажем, в формате JPEG.) 

Эти программы будут называться «хорошими», потому что они автоматически декодируются в линейный масштаб, когда вы запрашиваете глубину 16 или 32 бита. Но вы должны попросить их использовать глубину 16 или 32 бита ... 

Одним из недостатков Photoshop является то, что некоторые инструменты еще не доступны для 32-битных кодированных изображений, например, бикубическая повторная выборка. Процедура ниже более сложна, но она должна позволить обойти.Единственным недостатком могут быть некоторые ошибки округления (вероятно, невидимые) в результате преобразования в линейную гамму и обратно: 

  1. Преобразование в 16-битный / канальный режим для минимизации ошибок округления (необязательно).
  2. Перейдите к «Преобразовать в профиль» (в CS3 это находится в меню «Правка»).
  3. Выберите текущий профиль для пространства назначения (чтобы исходное и целевое пространство ссылались на одно и то же цветовое пространство) *, но не нажимайте OK *. Если ваш документ еще не управляется по цвету, sRGB, пожалуй, самое безопасное предположение. Это предварительно заполнит большинство полей для следующего шага ...
  4. Выберите «Пользовательский RGB» для места назначения. Вы получите всплывающее окно с просьбой указать параметры для вашего пользовательского цветового пространства.
  5. В опциях для настройки пользовательского цветового пространства оставьте все без изменений, кроме как установить гамму на 1.0.
  6. Нажмите OK в диалоговом окне «Пользовательский RGB», а затем нажмите «ОК» в диалоговом окне «Преобразовать в профиль».
  7. Изменить размер как обычно.
  8. Преобразовать в ваше предыдущее цветовое пространство.
  9. Если вы перешли в режим 16 бит / канал, вы можете преобразовать обратно в 8 бит / канал в этой точке.

 

Предположим, гамма 2,2

Идея проста: наложить гамму 0,454545, поработать над изображением, а затем наложить обратно гамму 2,2. 

Но: 

 



    



Это программное обеспечение «нехорошо», потому что вам нужно выполнить все операции: преобразовать в 16 или 32-разрядную глубину, запросить гамму 0,454545, а затем в конце преобразовать обратно в гамму 2,2 ... и в целом это не так. технически точный ... Во всяком случае, он делает свою работу. 

Этот прекрасный снимок показывает последовательность операций в приложении Acorn (с использованием версии Mac OS X до Mac OS X 10.6). Будьте осторожны: цепь показывает, что гамма 2,2 была применена до масштабирования. На самом деле, что Acorn понимает под этим, так это то, что гамма должна быть * декодирована из * 2.2, что означает, что была применена гамма 1 / 2.2, то есть 0,454545. И наоборот, в конце, когда применяется гамма 0,45, Acorn фактически применяет гамму 1 / 0,45 = 2,2: 
 

желудь гамма масштабирование


Теперь давайте посмотрим, как это работает или может работать с ImageMagick, Gimp-Gluas, CinePaint, PHP ... 

 

ImageMagick

Прежде всего, предупреждение: ImageMagick регулярно совершенствуется и трансформируется. То, что вы читаете здесь, это то, как у меня все работало, когда я делал тесты с ImageMagick Прочитайте это, чтобы получить некоторое понимание общих идей. Но он может не работать в той версии ImageMagick, которую вы используете. Возможно, вам придется адаптироваться. 

Библиотека ImageMagick позволяет конвертировать изображения в 16-битный формат и изменять гамму. Эта команда выполняет всю цепочку операций для изменения размера изображения с именем in.png к изображению с именем out.png. Изображение уменьшено до 50%: 
 

convert in.png -depth 16 -gamma 0.454545 -resize 50% -gamma 2.2 -depth 8 out.png


Вы можете заменить «-resize 50%» на любой набор операций с изображением, который вы хотите выполнить правильно. 

Я предполагаю, что изображение в файле in.png кодируется с глубиной 8 бит, и я хочу, чтобы out.png тоже был 8 бит. Если in.png уже закодирован в 16 бит, то -depth 16 бесполезен. И если вы хотите, чтобы out.png был закодирован в 16 бит, то, конечно, не используйте -depth 8 в конце. 

Только для вашей информации и навыков, вот как я масштабирую изображение в JPEG. Фильтр Ланцоша - единственный математически совершенный (на самом деле это будет фильтр Синка, но Ланцош - его практическая реализация). Например, если вы увеличите изображение, а затем вернетесь к его первоначальному размеру, несколько раз, только Lanczos и Sinc сохранят изображение идентичным. Параметр -depth 8 в конце был опущен, поскольку JPEG подразумевает 8-битную глубину. В итоге, коэффициент качества 95 и коэффициент выборки 1x1 позволяют получить почти точное изображение без потери цвета. 
 

convert in.any -depth 16 -gamma 0.454545 -filter lanczos -resize 50% -gamma 2.2 -quality 95 -sampling-factor 1x1 out.jpg


Несколько заметок:

Если вы хотите работать с изображением, скажем test.jpg, и уважать гамму, ImageMagick может помочь вам в этом: 

convert test.jpg -depth 16 -gamma 0.454545 temp1.ppm

convert temp7.ppm -gamma 2.2 result.png


В приведенном выше примере я преобразовал обратно в формат PNG, потому что это надежный сжатый формат. Если вы хотите конвертировать в JPEG, вам лучше указать желаемое качество. Качество 85 просто отлично в большинстве случаев. Качество 65 действительно плохое. Если вам нужно, чтобы изображение было почти точным, вы должны использовать коэффициент качества 95 или 100: 
 

convert temp7.ppm -gamma 2.2 -quality 85 result.jpg


Если вы работаете с изображениями с контрастными пикселями, такими как изображения с цифровыми вставками, или если вы хотите очень точного кодирования, то для правильного кодирования в формате JPEG вам следует запретить использование подвыборки, например: 
 

convert temp7.ppm -gamma 2.2 -quality 95 -sampling-factor 1x1 result.jpg


Если вы преобразуете обратно в формат, который допускает 16-битное кодирование, но вы хотите стандартное 8-битное кодирование, то вы должны попросить об этом: 
 

convert temp7.ppm -gamma 2.2 -depth 8 result.ppm


Теперь о расширенных и новых функциях. Начиная с ImageMagick 6.7.5-1, вы можете использовать лучше, чем параметр -gamma.Параметр -colorspace позволяет по-настоящему переключаться из цветового пространства sRGB в линейное цветовое пространство RGB и обратно в sRGB. Как это: 
 

convert in.jpg -colorspace RGB -resize 50% -colorspace sRGB out.jpg


Чтобы избежать артефактов отсечения, еще лучше использовать цветовое пространство LAB: 
 

convert in.jpg -colorspace LAB -resize 50% -colorspace sRGB out.jpg


Некоторая лекция: 

www.imagemagick.org/Usage/resize/#resize_colorspace  

www.imagemagick.org/Usage/color_basics/#perception

www.imagemagick.org/Usage/color_basics/#processing
www.imagemagick.org/Usage/resize/#resize_lab

 

 

Gimp-gluas

Gimp-gluas - это плагин для Gimp, который позволяет запускать скрипт Lua на изображении. После того, как вы установили плагин, он будет доступен в меню Фильтры -> Общие -> Глуас ... 

Я написал этот скрипт, который вы можете вырезать и вставить в диалоге редактирования скрипта Gluas из Gimp. (Похоже, что скрипт не работает на последних версиях Gimp, таких как Gimp 2.6.11 и Lua 5.1.4, из-за проблемы, которая подразумевает математическую библиотеку.) 
 

-- Image scaling with correct gamma

tile_x       = 2
tile_y       = 2
gamma        = 2.2

tile_surface = tile_x * tile_y
gamma_invert = 1 / gamma

for y = 0, math.floor (height / tile_y) - 1 do
	for x = 0, math.floor (width / tile_x) - 1 do

		sum_r, sum_g, sum_b = 0, 0, 0

		for ly = 0, tile_y - 1 do
			for lx = 0, tile_x - 1 do

				r, g, b = get_rgb (x * tile_x + lx, y * tile_y + ly)

				real_r = r ^ gamma
				real_g = g ^ gamma
				real_b = b ^ gamma

				sum_r = sum_r + real_r
				sum_g = sum_g + real_g
				sum_b = sum_b + real_b
			end
		end

		real_r = sum_r / tile_surface
		real_g = sum_g / tile_surface
		real_b = sum_b / tile_surface

		r = real_r ^ gamma_invert
		g = real_g ^ gamma_invert
		b = real_b ^ gamma_invert

		set_rgb (x, y, r, g, b)
	end
	progress (y * tile_y / height)
end


Значение tile_x, равное 2, означает, что изображение будет разделено пополам по горизонтали. Значение tile_y, равное 2, означает, что изображение будет разделено пополам по вертикали. Это элементарный алгоритм масштабирования. Он просто сжимает простые плитки пикселей. Если пиксели на правой и нижней границах не помещаются в полноразмерные плитки, они отбрасываются. 

Еще одним недостатком этого скрипта является то, что он не изменяет размер изображения холста. Вы должны вырезать масштабированное изображение самостоятельно. 

Основным и философским недостатком является то, что значения пикселей преобразуются в линейный масштаб только для вычисления масштабирования, а затем они немедленно преобразуются обратно в масштаб мощности. В правильной системе значения должны оставаться в линейном масштабе вплоть до окончательного кодирования в формате сжатого файла. 

Хотелось бы, чтобы такой скрипт просто конвертировал изображение в линейный масштаб. Затем изображение будет редактироваться в Gimp с использованием обычных инструментов. В конце симметричный скрипт преобразует изображение обратно в шкалу мощности. Это плохая идея, потому что Gimp использует 8-битные значения для каждого цветового канала. Темные оттенки будут взорваны. (Я не знаю, относится ли это к Gimp 2.10 и более поздним версиям.) 

 

Use the plugin for the Gimp

Себастьян Пиппинг создал плагин для Gimp: http://blog.hartwork.org/?p=1173. Он указывает, что это все еще прототип; медленный и ограниченный. 
 

Cinepaint

Используя CinePaint и аналогичное программное обеспечение, можно обойти это: 

Проблема в том, что вы работаете с изображением, не видя его настоящих цветов и оттенков серого. Я считаю, что текущие версии CinePaint технически способны правильно отображать изображение, пока оно выражается в линейном масштабе, загружая соответствующий «профиль icc» ... 
 

Быстрые расчеты

Упомянутые выше высокоточные вычисления являются хорошим подходом для универсальных и точных алгоритмов. Во многих случаях, таких как встроенные системы или специализированное программное обеспечение, могут использоваться гораздо более быстрые алгоритмы и подходы: 

 

PHP

Некоторое объяснение от Эндрю Пенри: 
 

Многие сайты используют php и gd2 для создания миниатюр. GD2 использует неправильное масштабирование, и изображение Далай-ламы становится серым. К счастью, у gd есть функция imagegammacorrect. Ниже приведен пример того, как его использовать для лучшего масштабирования. 


header('Content-type: image/jpeg');

$filename = 'gamma_dalai_lama_gray_tft.jpg';
$percent = 0.5;
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;

// Init original and new images in "true" color
$orig = imagecreatefromjpeg($filename);
$new = imagecreatetruecolor($new_width, $new_height);

// Correct gamma of orginal from 2.2 to 1.0
imagegammacorrect($orig, 2.2, 1.0);
// Resample
imagecopyresampled($new, $orig, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
// Correct gamma of new from 1.0 to 2.2
imagegammacorrect($new, 1.0, 2.2);

// Output
imagejpeg($new, null, 100);
?>


Cheers,
Andrew Penry
http://www.masterwebdesigners.com 


 

Признательность

Я хотел бы поблагодарить за их помощь, поддержку и советы Дмитрия Гати, Винсента Миндера и Фредерика Клот. 
Большое спасибо Фрэнку Питерсу за то, что он открыл мне инструментарий Netpbm. 
Спасибо Сэму Хоцевару за смутные примеры. 
Спасибо Ойвинду Колосу за указание на программное обеспечение GEGL. 
Спасибо Дастину Харману за просмотр опечатки на digg.org. 
Спасибо David Greenspan за указание на необходимость добавления изображений, откалиброванных для компьютеров Macintosh. 
Спасибо Джерраду Пирсу за лучшую английскую формулировку. 
Спасибо Крису Кингу за прикованную команду ImageMagick. 
Спасибо Rylee Isitt за процедуру и подробности о Photoshop CS3. 
Спасибо Дереку Хофманну за предложение показать изображение, масштабированное браузером. 
Спасибо Майклу Винтеру за сообщение об Image Analyzer. 
Спасибо Саймону Лундбергу за сообщение об Aperture 1.5.6. 
Спасибо Джо Дэвиссону за хорошие новости о Рендере. 
Спасибо Дону Эдди за хорошие новости о Adobe Photoshop Lightroom. 
Спасибо Джованни Баджо за упоминание о возможности ускорить расчеты. 
Спасибо Рону Кой за хорошие новости о Pixelmator. 
Спасибо Jean-Marie Pichot за хорошие новости о Paint Shop Pro X2. 
Спасибо Франческо Белломи за хорошие новости о приложении Preview в Mac OS X 10.6 и, возможно, обо всей Mac OS X 10.6, поскольку приложение Core Image Fun House вело себя правильно. 
Спасибо WormSlayer за отправку фотографии с артефактом зеленых линий, фотошопом. 
Спасибо Дэниелу Фелпсу (Daniel Felps) за то, что он позволил мне понять, что артефакт зеленых линий в Photoshop и Firefox, вероятно, связан с фильтром сглаживания, который используется до того, как изображение будет уменьшено. 
Спасибо Джареду Эрлу за повторную передачу правильности алгоритма Ланцоша в приложении Acorn. 
Спасибо Марку Виссеру за объяснение, как справляется гамма в индустрии VFX. 
Спасибо Райану Ранеру за сообщение о том, что 32-битные изображения в Photoshop CS4 тоже обрабатываются правильно. 
Спасибо Петеру Шамерхорну за хорошие новости о Corel Photo Paint X4 при условии использования 32-битной глубины. 
Спасибо Скотту Брики за отправку масштабированного изображения MSPaint. 
Спасибо Джастину Уильямсу за хорошие новости о Photoshop CS4 64bit и 16-битной глубине, а также за примеры особых случаев. 
Спасибо Рою Хуперу за хорошие новости о Adobe Photoshop Lightroom 2. 
Спасибо Ananth Deodhar за хорошие новости о Deodar Quark XPress 7.0 и 8.0. 
Спасибо Павлу Качору за сообщение о том, что команда sips в Mac OS X еще не масштабируется правильно. 
Спасибо Джону Купиту за то, что он указал на философию Nip2. 
Спасибо Steinar H. Gunderson за объяснения по поводу sRGB, YCbCr и JPEG. 
Спасибо Даниэле Де Феличе за указание на Firefox. 
Спасибо Карелу Кулхави за то, что он указал, что Линкс сделал все правильно. 
Спасибо Гохану Унелю за сообщение об Aperture 3.0. 
Спасибо Альберту Кахалану за хорошие новости о Tux Paint. 
Спасибо Майку Брэди за сообщение об ACD Canvas X и Paint.NET. 
Спасибо Эндрю Пенри за объяснения по поводу PHP. 
Спасибо Джорджу Курусиасу за сообщение о Python Imaging Library, ITT IDL и ImageJ и за уместное замечание о научных изображениях. 
Спасибо Сту Кроне за то, что он указал, что Lightroom также подходит для Windows. 
Спасибо Эрику Краузе за ссылку ниже. 
Спасибо Юргену Эйдту за хорошие новости о cPicture. 
Спасибо Торстену Лемке за хорошие новости о GraphicConverter. 
Спасибо Кармине Паолино за точность в предварительном просмотре и Pixelmator и прекрасный снимок Acorn. 
Спасибо Курту Роксу за ссылку на статью о Пойнтоне. 
Спасибо dos386 за то, что он указал, что sRGB должен быть выдвинут, что формулы или не экспоненты, а полномочия, за новости о XNview / NConvert и Opera и за то, что указал, что причина, по которой простые браузеры не масштабируют картинки, заключается в том, что я был используя новые модные теги в стиле HTML / CSS. 
Спасибо Joey Liaw за замечание о 3D-приложениях и ссылку. 
Спасибо Игорю Лопесу за хорошие новости о Bibble 5. 
Спасибо Константину Свисту за сообщение о том, что Kolourpaint не соответствует гамма-характеристике. 
Спасибо Бену Чемберлену (Ben Chamberlain) за указание на необходимость использовать -resize вместо -scale для ImageMagick и потерю информации при работе с 256-цветным изображением в оттенках серого. 
Спасибо Иштвану Ковачу за хорошие новости о RawTherapee. 
Спасибо Торстену Кауфману за хорошие новости о NUKE и указание на страницы, написанные Биллом Спитцаком. 
Спасибо Себастьяну Пипингу за указание на проблему с рутиной Lua, за создание плагина для Gimp и за предложение патча для Gimp.
Спасибо Konrad Milczarek за ссылки на тег colospace в ImageMagick и за ResampleHQ. 
Спасибо Yongwei Wu за отзыв о Mac OS X. 
Спасибо Энтони Тиссену за разъяснения по поводу параметра -colorspace. 
Спасибо Waken за указание на мертвую ссылку. 
Спасибо Йоханнесу Хутеру за хорошие новости об IrfanView. 
Спасибо Себастьяну Гиркену за хорошие новости о Дилло. 
Спасибо Рафе за хорошие новости о SAR Image Processor и о цветовом пространстве LAB в ImageMagick. 
Спасибо Michiel Verkoijen за хорошие новости о TinyPNG. 
Спасибо Лео Боднару за адрес его страницы. 
Спасибо Рудольфу Эйбергу за ссылки на методы изменения размера и компандирования. 
Спасибо Джонатану Кэрроллу за изображение с размытыми чешуйками. 
Спасибо Джонни Йоханссону за хорошие новости о Gimp 2.10. 

Слева Натану Мэтьюзу удалось восстановить изображение Далай-ламы, используя фильтры в Фотошопе. В середине Дэвид Эллсворт использовал фильтры FFT и изображение Далай-ламы, предназначенное для дисплеев TFT. Справа оригинальное изображение, которое я использовал. 
 

     Далай-лама



Йонас Берлин прислал это изображение. Уменьшите его до 1: 2 с помощью программного обеспечения ...: 
 

программное обеспечение сосет или управляет гаммой




Раньше была другая страница на эту тему по этому адресу: www.all-in-one.ee/~dersch/gamma/gamma.html. 

Эта страница Лео Боднара имеет отличную графику, например, чтобы показать, что для линейного кодирования необходимо минимум 12 пикселей: http://lbodnar.dsl.pipex.com/imaging/gamma.html

Точные определения: www.poynton.com/notes/colour_and_gamma/GammaFAQ.html

Разработчики 3D-приложений должны указать sRGB, если они используют текстуры источника гамма-пространства: http.developer.nvidia.com/GPUGems3/gpugems3_ch24.html


О кодировке sRGB, объяснения Билла Спитцака: mysite.verizon.net/spitzak/conversion


Ссылки предоставлены Рудольфом Эйбергом: 

www.imagemagick.org/Usage/resize/#techniques объясняет варианты с линейным преобразованием RGB, LAB, LUV, Gamma или сигмоидальный. 
В электротехнике нелинейное кодирование очень обычно и очень хорошо известно. Он также известен как «Companding» en.wikipedia.org/wiki/Companding  и используется в течение очень долгого времени в телефонной голосовой передаче en.wikipedia.org/wiki/A-law_algorithmen.wikipedia.org/wiki/G.711


Комментарии на Slashdot : tech.slashdot.org/story/10/02/23/2317259/Scaling-Algorithm-Bug-In-Gimp-Photoshop-Others (большое спасибо Wescotte) 

Об этой странице также сообщили на www.reddit.com

Все упомянутые названия продуктов являются зарегистрированными товарными знаками соответствующих владельцев. 

Компьютерные скрипты, которые я написал для этой страницы, находятся под лицензией GNU GPLv3. 
 

Эрик Брассер - с 30 августа 2007 года по 30 сентября 2018 года