Как выбрать метод интерполяции изображения? (Emgu / OpenCV) - PullRequest
20 голосов
/ 24 июня 2010

Функция изменения размера изображения, предоставляемая Emgu (оболочка .net для OpenCV), может использовать любой из четырех методов интерполяции :

  1. CV_INTER_NN (по умолчанию)
  2. CV_INTER_LINEAR
  3. CV_INTER_CUBIC
  4. CV_INTER_AREA

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

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

Тогда мой вопрос: каковы плюсы и минусы каждого метода интерполяции? Чем они отличаются и какую мне использовать?

Ответы [ 4 ]

21 голосов
/ 24 июня 2010

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

Линейная интерполяция менее быстра, но не приведет к потере информации , если вы несжатие изображения (которым вы являетесь).

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

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

Обновление: эта ссылка дает более подробную информацию(включая пятый тип, не включенный в ваш список):

http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html?highlight=resize#resize

10 голосов
/ 24 июня 2010

Используемый метод интерполяции зависит от того, чего вы пытаетесь достичь:

CV_INTER_LINEAR или CV_INTER_CUBIC применить фильтр нижних частот (средний) для достиженияКомпромисс между визуальным качеством и удалением краев (фильтры нижних частот, как правило, удаляют края, чтобы уменьшить наложение изображений).Между этими двумя, я бы порекомендовал вам CV_INTER_CUBIC .

CV_INTER_NN метод на самом деле является ближайшим соседом, это самый простой метод, и вы получите более острые краяфильтр нижних частот будет применен).Однако этот метод просто похож на «масштабирование» изображения, без визуального улучшения.

6 голосов
/ 31 мая 2017

Алгоритмы: (описания взяты из документации OpenCV)

  • INTER_NEAREST - интерполяция ближайшего соседа
  • INTER_LINEAR - билинейная интерполяция (используется по умолчанию)
  • INTER_AREA - повторная выборка с использованием отношения площади пикселя.Это может быть предпочтительный метод для прореживания изображений, поскольку он дает результаты без муаров.Но когда изображение увеличено, оно похоже на метод INTER_NEAREST.
  • INTER_CUBIC - бикубическая интерполяция по окрестности 4x4 пикселей
  • INTER_LANCZOS4 - интерполяция Ланцоша по окрестности 8x8 пикселей

Если вы хотите увеличить скорость, используйте метод Nearest Neighbor.

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

Вы можете найти подробный анализ сравнения скорости здесь

Ниже приведено сравнение скорости на изображении 400 * 400 пикселей, полученном по вышеуказанной ссылке

Speed comparison

1 голос
/ 24 июня 2010

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

Извините, что нет правильного ответа - поэтому есть выбор

...