Как я делаю высококачественное масштабирование изображения?

18
задан Ian Boyd 6 April 2017 в 18:59
поделиться

11 ответов

Я нашел wxWidgets реализацию довольно простой для изменения как требуется. Это - весь C++ так никакие проблемы с мобильностью там. Единственная разница - то, что их реализация работает с неподписанными массивами символов (который я нахожу, чтобы быть самым легким способом иметь дело с изображениями во всяком случае) с порядком байтов RGB и альфа-компонента в отдельном массиве.

, Если Вы обращаетесь к "src/common/image.cpp" файлу в wxWidgets исходном дереве, существует функция вниз-сэмплера, которая использует метод выборки поля "wxImage:: ResampleBox" и функция-счетчика, вызванная "wxImage:: ResampleBicubic".

2
ответ дан 30 November 2019 в 09:25
поделиться

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

2
ответ дан 30 November 2019 в 09:25
поделиться

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

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

Редактирование: Это была работа Mitchell-Netravali, о которой я думал, на который ссылаются в нижней части этой ссылки:

http://www.cg.tuwien.ac.at/~theussl/DA/node11.html

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

2
ответ дан 30 November 2019 в 09:25
поделиться

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

идея состоит в том, чтобы взять равномерно расположенные с интервалами образцы от Вашего исходного изображения; в Вашем случае, 55 из 256, или один из каждых 4.6545. Только вокруг числа, чтобы заставить пиксель выбирать.

2
ответ дан 30 November 2019 в 09:25
поделиться

Попытайтесь использовать Adobe Generic Image Library ( http://opensource.adobe.com/wiki/display/gil/Downloads ), если Вы хотите что-то готовое и не только алгоритм.

<час>

Извлечение из: http://www.catenary.com/howto/enlarge.html#c

Увеличивает или Уменьшает - Исходный код C Требует Библиотеки Обработки изображений Victor для 32-разрядного Windows v 5.3 или выше.


int enlarge_or_reduce(imgdes *image1)
{
   imgdes timage;
   int dx, dy, rcode, pct = 83; // 83% percent of original size

   // Allocate space for the new image
   dx = (int)(((long)(image1->endx - image1->stx + 1)) * pct / 100);
   dy = (int)(((long)(image1->endy - image1->sty + 1)) * pct / 100);
   if((rcode = allocimage(&timage, dx, dy,
      image1->bmh->biBitCount)) == NO_ERROR) {
      // Resize Image into timage
      if((rcode = resizeex(image1, &timage, 1)) == NO_ERROR) {
         // Success, free source image
         freeimage(image1);
         // Assign timage to image1
         copyimgdes(&timage, image1);
         }
      else // Error in resizing image, release timage memory
         freeimage(&timage);
      }
   return(rcode);
}

Этот пример изменяет размер области изображения и заменяет исходное изображение новым изображением.

1
ответ дан 30 November 2019 в 09:25
поделиться

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

Intel IPP

1
ответ дан 30 November 2019 в 09:25
поделиться

Это походит на то, что Вы действительно испытываете затруднения при понимании, дискретное-> непрерывный-> дискретный поток, вовлеченный в надлежащую передискретизацию изображения. Хорошим техническим отчетом, который мог бы помочь дать Вам понимание этого, что Вам нужно, является Alvy Ray Smith , Пиксель А Не Немного Квадрата .

1
ответ дан 30 November 2019 в 09:25
поделиться

Универсальная статья от нашего любимого хоста: Лучшее Изображение, Изменяющее размер , обсуждая относительные качества различных алгоритмов (и это связывается с другой статьей CodeProject).

1
ответ дан 30 November 2019 в 09:25
поделиться

Смотрите на ImageMagick, который делает все виды перемасштабирования фильтров.

0
ответ дан 30 November 2019 в 09:25
поделиться

Как развитие, Jeremy Rudd отправил эта статья выше. Это реализует фильтрованный два изменения размеров передачи. Источники являются C#, но выглядит достаточно ясным, что я могу портировать его, чтобы дать ему попытку. Я вчера нашел очень похожий код C, который было намного более трудно понять (очень плохие имена переменной). Я получил его к виду работы, но это было очень медленно и не приводило к хорошим результатам, которые привели меня полагать, что в моей адаптации была ошибка. У меня может быть лучшая удача при записи этого с нуля с этим как ссылка, которую я попробую.

, Но рассматривающий, как две работы алгоритма передачи интересно, нет ли более быстрого способа сделать его, возможно, даже в одной передаче?

0
ответ дан 30 November 2019 в 09:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: