В этом примере показано, как использовать griddedInterpolant
передискретизировать пиксели в изображении. Передискретизация изображения полезна для корректировки разрешения и размера, и также можно использовать его, чтобы сгладить пиксели после изменения масштаба.
Загрузите и покажите изображению ngc6543a.jpg
, который является изображением Космического телескопа Хабблa планетарных туманностей NGC 6543. Это изображение отображает несколько интересных структур, таких как концентрические газовые интерпретаторы, струи высокоскоростного газа и необычные узлы газа. Матричный A
это представляет изображение, 650 600 3 матрицами uint8
целые числа.
A = imread('ngc6543a.jpg');
imshow(A)
Создайте объект 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')
Точно так же уменьшайте размер изображения путем запроса 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')
Когда вы увеличиваете масштаб изображения, пиксели в необходимой области становятся больше, и деталь в изображении быстро потеряна. Можно использовать передискретизацию изображений, чтобы сгладить эти артефакты изменения масштаба.
Увеличьте масштаб яркого пятна в центре оригинального изображения. (Индексация в A
должен сосредоточить это яркое пятно в изображении так, чтобы последующее изменение масштаба не продвигало его из системы координат.)
imshow(A(1:570,10:600,:),'InitialMagnification','fit') zoom(10) title('Original Image, 10x Zoom')
Запросите 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')
F.Method = 'cubic'; vq = uint8(F({xq,yq})); imshow(vq(1:5700,150:5900,:),'InitialMagnification','fit') zoom(10) title('Cubic method')
F.Method = 'spline'; vq = uint8(F({xq,yq})); imshow(vq(1:5700,150:5900,:),'InitialMagnification','fit') zoom(10) title('Spline method')