Изменение размера изображения: что такое "фильтр"?
Я пытаюсь понять, как работает изменение размера изображения - кто-нибудь может мне объяснить, для чего нужен "фильтр"?
фильтр рассчитывает, сколько исходного пикселя вносит вклад в целевой пиксель?
есть фильтры типа "box" и "gaussian", но есть ли фильтр с именем "bicubic"? Здесь я смешиваю две концепции, одна из которых является "фильтром свертки" и...?
Можно ли использовать один и тот же фильтр для увеличения и уменьшения масштаба? (было бы здорово увидеть пример кода этого)
Желательно ли сначала растянуть изображение в одном измерении, а затем в другом?
1 ответ
При изменении размера изображения фильтр избегает явления, называемого псевдонимами. Если вы пытаетесь изменить размер без фильтра, псевдонимы обычно проявляются как неприятные пиксельные эффекты, которые особенно заметны при анимации...
Чтобы ответить на ваши вопросы:
Фильтр вычисляет, сколько каждый исходный пиксель вносит в каждый пункт назначения. Для изменения размера вам нужен линейный фильтр, который довольно прост: фильтр можно рассматривать как небольшое изображение в градациях серого; фактически вы центрируете фильтр по местоположению, соответствующему каждому выходному пикселю, умножаете каждый соседний пиксель на значение фильтра в этом месте и складываете их, чтобы получить значение выходного пикселя.
Все такие фильтры являются "фильтрами свертки", потому что свертка - это математическое название операции, описанной выше. Фильтр "box" в буквальном смысле выглядит как блок - каждый пиксель в блоке имеет одинаковый весовой коэффициент, тогда как "гауссовские" фильтры представляют собой более округлые капли, растягивающиеся к нулю на краю.
Самая важная вещь для увеличения и уменьшения масштаба - это выбрать правильный размер для вашего фильтра. Вкратце, вы хотите масштабировать свой фильтр в зависимости от того, какой из входов и выходов имеет самое низкое разрешение. Вторым по важности является избегание плохих фильтров: фильтр "box" - это то, что вы обычно получаете, когда пытаетесь изменить размер без фильтрации; "Билинейный" фильтр, предоставляемый аппаратным обеспечением компьютерной графики, обеспечивает посредственное масштабирование, но поставляется с неправильным размером для масштабирования.
Из соображений производительности желательно масштабировать изображения в одном измерении, а затем в другом. Это означает, что ваш фильтр работает намного быстрее: по времени, пропорциональному ширине фильтра, а не пропорциональному площади фильтра. Все обсуждаемые здесь фильтры являются "разделимыми", что означает, что вы можете применять их таким образом.
Если вы выберете высококачественный фильтр, точная форма менее критична, чем вы думаете. Существует два класса хороших фильтров: полностью положительные, такие как "гауссовский", которые имеют тенденцию к размытой стороне, и отрицательно-лопастные, такие как "Ланцошо", которые являются острыми, но могут давать незначительные звенящие эффекты. Обратите внимание, что "бикубические" фильтры - это категория, которая включает в себя "B-сплайн", который является полностью положительным, и "Mitchell" и "Catmull-Rom", которые имеют отрицательные лепестки.