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

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

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

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

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

Создание Interpolant

Создайте объект 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')

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

|

Похожие темы