В этом примере показано, как использовать griddedInterpolant
для повторного выбора пикселей в изображении. Повторная дискретизация изображения полезна для настройки разрешения и размера, а также можно использовать его для сглаживания пикселей после масштабирования.
Загрузите и отобразите изображение ngc6543a.jpg
, который представляет собой изображение космического телескопа Хаббла планетарной туманности NGC 6543. На этом изображении отображены несколько интересных структур, такие как концентрические газовые интерпретаторы, струи скоростного газа и необычные узлы газа. Матрица A
который представляет изображение является матрицей 650 на 600 на 3 uint8
целые числа.
A = imread('ngc6543a.jpg');
imshow(A)
Создайте интерполяционный объект с сеткой для изображения. 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 пикселей. Вычислите интерполяцию в точках запроса с помощью синтаксиса 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')
Точно так же уменьшите размер изображения путем запроса интерполяции с 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')
Запросите F интерполяции
воспроизведение этого увеличенного изображения (приблизительно) с 10-кратным более высоким разрешением. Сравните результаты нескольких различных методов интерполяции.
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')