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

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

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

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

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

Figure contains an axes object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object with title Spline method contains an object of type image.

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

|

Похожие темы