Каков наилучший алгоритм уменьшения изображения (по качеству)? - PullRequest
64 голосов
/ 22 декабря 2008

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

Добавлено:

Я проверил Paint.NET, и, к моему удивлению, кажется, что Super Sampling лучше, чем бикубический, при уменьшении размера изображения. Это заставляет меня задаться вопросом, являются ли алгоритмы интерполяции подходящим способом.

Это также напомнило мне алгоритм, который я «изобрел» сам, но никогда не реализовывал. Я предполагаю, что у этого также есть имя (поскольку кое-что это тривиальное не может быть идеей меня одного), но я не мог найти это среди популярных. Super Sampling был самым близким.

Идея такова - для каждого пикселя на целевом изображении рассчитайте, где он будет на исходном изображении. Это, вероятно, наложит один или несколько других пикселей. Тогда можно будет рассчитать площади и цвета этих пикселей. Затем, чтобы получить цвет целевого пикселя, нужно просто вычислить среднее значение этих цветов, добавив их области в качестве «весов». Таким образом, если целевой пиксель будет покрывать 1/3 желтого исходного пикселя и 1/4 зеленого исходного пикселя, я получу (1/3 * желтый + 1/4 * зеленый) / (1/3 + 1/4).

Это, естественно, было бы вычислительно интенсивным, но оно должно быть как можно ближе к идеалу, не так ли?

Есть ли название для этого алгоритма?

Ответы [ 6 ]

66 голосов
/ 30 мая 2011

К сожалению, я не могу найти ссылку на первоначальный опрос, но когда голливудские кинематографисты перешли от кинофильмов к цифровым изображениям, этот вопрос часто возникал, поэтому кто-то (может быть, SMPTE, может быть, ASC) собрал группу профессиональных кинематографистов и показал им кадры, которые были перемасштабированы с использованием нескольких разных алгоритмов. Результатом было то, что для этих профессионалов, смотрящих на огромные кинофильмы, было достигнуто согласие, что Митчелл (также известный как высококачественный Catmull-Rom) является лучшим для увеличения и sinc является лучшим для уменьшения. Но sinc - это теоретический фильтр, который уходит в бесконечность и поэтому не может быть полностью реализован, поэтому я не знаю, что они на самом деле имели в виду под «sinc». Вероятно, это относится к усеченной версии sinc. Lanczos - это один из нескольких практических вариантов sinc, который пытается улучшить только его усечение и, вероятно, является лучшим выбором по умолчанию для уменьшения количества неподвижных изображений. Но, как обычно, это зависит от изображения и того, что вы хотите: сжатие рисунка для сохранения линий - это, например, случай, когда вы предпочитаете делать акцент на сохранении краев, что было бы нежелательно при уменьшении фотографии цветов.

Хороший пример результатов различных алгоритмов на Cambridge in Color .

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

Теперь у ImageMagick есть обширное руководство по фильтрам передискретизации , если вы действительно хотите в него войти.

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

19 голосов
/ 22 декабря 2008

Имеется выборка Ланцоша , которая медленнее бикубической, но дает изображения более высокого качества.

14 голосов
/ 24 октября 2010

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

Лично я бы порекомендовал (по районам) усреднять выборки для большинства задач понижающей дискретизации. Это очень просто, быстро и почти оптимально. Гауссовская повторная выборка (с выбранным радиусом, пропорциональным обратному коэффициенту, например радиусу 5 для понижающей дискретизации на 1/5), может дать лучшие результаты с немного большими вычислительными затратами и более математически обоснованным.

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

7 голосов
/ 22 декабря 2008

Я видел статью о Slashdot о Резьба по шву некоторое время назад, возможно, стоит посмотреть.

Резьба по шву - это изменение размера изображения алгоритм, разработанный Shai Avidan и Ариэль Шамир. Этот алгоритм изменяет размеры изображения не по масштабирование или обрезка, а скорее разумное удаление пикселей из (или добавление пикселей к) изображению, которое несет малое значение.

4 голосов
/ 18 сентября 2009

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

2 голосов
/ 08 июня 2011

Есть ли название для этого алгоритма?

Это может быть упомянуто как "коробка" или "окно" пересэмплирования в литературе. Как вы думаете, это на самом деле менее затратно для вычислений.

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

...