Введение
Мне интересно написать функцию, которая выводит для меня следующий уровень в Gaussian Pyramid (в конечном итоге я хочу создать Лапласианскую пирамиду) для использования в обработке изображений. (Ссылка для ссылки https://en.wikipedia.org/wiki/Pyramid_(image_processing)#Gaussian_pyramid)
Проблема понижающего дискретизации
Теперь легкая часть этого заключается в том, что когда вы снижаете/повышаете выбор, фильтр 5-кратковременно сверяется с изображением перед изменением размера.
Однако интересная часть создания пирамид изображения заключается в том, что вам приходится уменьшать и увеличивать размер изображения в 0,5 или 2 раза в зависимости от того, в каком направлении вы собираетесь двигаться. У Swift есть несколько способов сделать это, например, используя CIAffineTransform и CILanczosTransform, однако мне интересно, есть ли способы сделать это немного наивно, потому что меня не интересует качество измененного изображения. Для этого сообщения я собираюсь использовать Lenna (512x512) в качестве примера, как показано ниже:
Если мы хотим уменьшить размер изображения в два раза, мы возьмем все нечетные пиксельные данные для формирования нового изображения. В MATLAB это выполняется следующим образом (после гауссовского размытия):
Если I
является вашим входным изображением и имеет размер NxM, с 3-мя сопоставлениями цветов, хранящимися для P (матрица 512x512x3), то уменьшенное изображение по шкале от .5 составляет
R = I(1:2:end, 1:2:end,:)
Все новое изображение является предыдущим с нечетными пронумерованными столбцами и строками изображения. Это дает следующее: 256x256 фото, которое является первым уровнем гауссовой пирамиды:
существует ли такая вещь в быстром? Является ли это выполнимым в Core Image или, возможно, в качестве настраиваемого фильтра OpenGL?
Проблема с повышающей дискретизацией:
Upsampling действительно используется только при создании лапласианской пирамиды. Однако наивная идея сделать это - сделать следующее:
Инициализировать R
, контекст чистого изображения, размер которого вы хотите увеличить. В этом случае мы будем повышать дискретизацию сниженной фотографии Lenna, как показано выше, поэтому R
должно быть пустым изображением 512x512.
Затем умножьте значения пикселей изображения с пониженной дискретизацией, I
на 4. Это можно сделать быстро, свернув изображение с помощью матрицы 3x3 [0,0,0;0,4,0;0,0,0]
. Затем можно равномерно распределить пиксели изображения в большее пустое изображение, R
. Это выглядит так:
Наконец, на этом изображении можно использовать одно и то же 5-кратное гауссовское размытие, чтобы восстановить изображение с улучшенной дискретизацией:
Я хотел бы знать, можно ли использовать подобный метод upsampling в swift.
Еще одна вещь, о которой я не знаю, - это то, что на практике важно изменить размер изображения для гауссовой/лапласианской фильтрации. Если нет, то, конечно, я мог бы использовать самый быстрый встроенный метод, чем пытаться сделать свой собственный.