Этот пример показывает, как использовать griddedInterpolant
, чтобы передискретизировать пиксели в изображении. Передискретизация изображения полезна для корректировки разрешения и размера, и также можно использовать его, чтобы сгладить пиксели после изменения масштаба.
Загрузите и покажите изображению ngc6543a.jpg
, который является изображением Космического телескопа Хабблa планетарных туманностей NGC 6543. Это изображение отображает несколько интересных структур, таких как концентрические газовые интерпретаторы, струи высокоскоростного газа и необычные узлы газа. Матричный A
, который представляет изображение, является 650 600 3 матрицами uint8 целых чисел.
A = imread('ngc6543a.jpg');
imshow(A)
Создайте объект interpolant с координатной сеткой для изображения. Для изображений это подходит, чтобы использовать сетку по умолчанию, поскольку пиксели имеют положительные целочисленные местоположения. Поскольку griddedInterpolant
только работает на матрицы с одинарной точностью и с двойной точностью, преобразуйте uint8 матрицу в двойную точность.
F = griddedInterpolant(double(A));
Когда вы передискретизируете изображение с помощью большого количества узлов решетки, лучший способ запросить interpolant использует векторы сетки. Векторы сетки группируются как вектор-столбцы в массиве ячеек {xg1,xg2,...,xgN}
. Векторы сетки являются компактным способом представлять сетку точек запроса. С векторами сетки griddedInterpolant
не должен формировать полную сетку, чтобы выполнить вычисления.
Найдите размер исходных матричных размерностей и используйте те размеры размерности, чтобы передискретизировать изображение так, чтобы это были 120% размер. Таким образом, для каждого 5 пикселей в оригинальном изображении интерполированное изображение имеет 6 пикселей.
[sx,sy,sz] = size(A);
xq = (0:5/6:sx)';
yq = (0:5/6:sy)';
zq = (1:sz)';
vq = uint8(F({xq,yq,zq}));
figure
imshow(vq)
title('Higher Resolution')
Точно так же уменьшайте размер изображения путем запроса interpolant с на 55% меньшим количеством точек, чем оригинальное изображение. В то время как можно просто индексировать в матрицу оригинального изображения, чтобы произвести более низкие изображения разрешения, интерполяция позволяет вам передискретизировать изображение в пиксельных местоположениях нецелого числа.
xq = (0:1.55:sx)';
yq = (0:1.55:sy)';
zq = (1:sz)';
vq = uint8(F({xq,yq,zq}));
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:sx)'; yq = (1:0.1:sy)'; zq = (1:sz)'; figure F.Method = 'linear'; vq = uint8(F({xq,yq,zq})); imshow(vq(1:5700,150:5900,:),'InitialMagnification','fit') zoom(10) title('Linear method')
figure F.Method = 'cubic'; vq = uint8(F({xq,yq,zq})); imshow(vq(1:5700,150:5900,:),'InitialMagnification','fit') zoom(10) title('Cubic method')
figure F.Method = 'spline'; vq = uint8(F({xq,yq,zq})); imshow(vq(1:5700,150:5900,:),'InitialMagnification','fit') zoom(10) title('Spline method')