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

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

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

Загрузите и покажите изображению ngc6543a.jpg, который является изображением Космического телескопа Хабблa планетарных туманностей 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.

Создание Interpolant

Создайте объект interpolant с координатной сеткой для изображения. 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 пикселей. Оцените interpolant в точках запроса с синтаксисом 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.

Точно так же уменьшайте размер изображения путем запроса interpolant с на 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.

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

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.

Смотрите также

|

Похожие темы