Повторная выборка изображения с интерполяцией с координатной сеткой

В этом примере показано, как использовать griddedInterpolant для повторного выбора пикселей в изображении. Повторная дискретизация изображения полезна для настройки разрешения и размера, а также можно использовать его для сглаживания пикселей после масштабирования.

Загрузка изображения

Загрузите и отобразите изображение ngc6543a.jpg, который представляет собой изображение космического телескопа Хаббла планетарной туманности NGC 6543. На этом изображении отображены несколько интересных структур, такие как концентрические газовые интерпретаторы, струи скоростного газа и необычные узлы газа. Матрица A который представляет изображение является матрицей 650 на 600 на 3 uint8 целые числа.

A = imread('ngc6543a.jpg');
imshow(A)

Figure contains an axes. The axes contains an object of type image.

Создание интерполяции

Создайте интерполяционный объект с сеткой для изображения. griddedInterpolant работает только для матриц двойной точности и одинарной точности, поэтому преобразуйте uint8 матрица в double. Чтобы интерполировать каждый канал RGB изображения, задайте два вектора сетки, чтобы описать точки выборки в первых двух размерностях. Векторы сетки сгруппированы как векторы-столбцы в массиве ячеек {xg1,xg2,...,xgN}. С помощью этой формулировки griddedInterpolant обрабатывает матрицу 3-D как содержащую несколько наборов 2D данных, определенных в одной сетке.

sz = size(A);
xg = 1:sz(1);
yg = 1:sz(2);
F = griddedInterpolant({xg,yg},double(A));

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

Используйте размеры первых двух матричных размерностей, чтобы повторно отобразить изображение так, чтобы оно составляло 120% от размера. То есть на каждые 5 пикселей в оригинальное изображение интерполированное изображение имеет 6 пикселей. Вычислите интерполяцию в точках запроса с помощью синтаксиса F({xq,yq}). griddedInterpolant оценивает каждую страницу в 3-D изображении в точках запроса.

xq = (0:5/6:sz(1))';
yq = (0:5/6:sz(2))';
vq = uint8(F({xq,yq}));
imshow(vq)
title('Higher Resolution')

Figure contains an axes. The axes with title Higher Resolution contains an object of type image.

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

xq = (0:1.55:sz(1))';
yq = (0:1.55:sz(2))';
vq = uint8(F({xq,yq}));
figure
imshow(vq)
title('Lower Resolution')

Figure contains an axes. The axes with title Lower Resolution contains an object of type image.

Сглаживайте программные продукты масштабирования

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

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

imshow(A(1:570,10:600,:),'InitialMagnification','fit')
zoom(10)
title('Original Image, 10x Zoom')

Figure contains an axes. The axes with title Original Image, 10x Zoom contains an object of type image.

Запросите F интерполяции воспроизведение этого увеличенного изображения (приблизительно) с 10-кратным более высоким разрешением. Сравните результаты нескольких различных методов интерполяции.

xq = (1:0.1:sz(1))';
yq = (1:0.1:sz(2))';
F.Method = 'linear';
vq = uint8(F({xq,yq}));
imshow(vq(1:5700,150:5900,:),'InitialMagnification','fit')
zoom(10)
title('Linear method')

Figure contains an axes. The axes with title Linear method contains an object of type image.

F.Method = 'cubic';
vq = uint8(F({xq,yq}));
imshow(vq(1:5700,150:5900,:),'InitialMagnification','fit')
zoom(10)
title('Cubic method')

Figure contains an axes. The axes with title Cubic method contains an object of type image.

F.Method = 'spline';
vq = uint8(F({xq,yq}));
imshow(vq(1:5700,150:5900,:),'InitialMagnification','fit')
zoom(10)
title('Spline method')

Figure contains an axes. The axes with title Spline method contains an object of type image.

См. также

|

Похожие темы