Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

그리딩된 보간으로 이미지를 리샘플링하기

이 예제에서는 griddedInterpolant를 사용하여 이미지의 픽셀을 리샘플링하는 방법을 보여줍니다. 이미지 리샘플링은 해상도와 크기를 조정하는 데 유용합니다. 이미지를 리샘플링하여 확대/축소 후에 픽셀을 평활화할 수도 있습니다.

이미지 불러오기

행성상성운 NGC 6543의 허블 우주 망원경 이미지인 ngc6543a.jpg 이미지를 불러와서 표시합니다. 이 이미지는 동심원 가스 껍질, 고속 가스 분출, 특이한 가스 매듭과 같은 여러 흥미로운 구조를 보여줍니다. 이미지를 나타내는 행렬 A는 uint8 정수로 구성된 650×600×3 행렬입니다.

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

보간 생성하기

이미지에 대해 그리딩된 보간 객체를 생성합니다. 이미지의 경우, 픽셀이 양의 정수 위치에 있으므로 디폴트 그리드를 사용하는 것이 적합합니다. griddedInterpolant는 배정밀도 행렬과 단정밀도 행렬에만 사용할 수 있으므로, unit8 행렬을 배정밀도로 변환하십시오.

F = griddedInterpolant(double(A));

이미지 픽셀 리샘플링하기

많은 수의 그리드 점을 사용하여 이미지를 리샘플링하는 경우, 보간을 쿼리하는 가장 좋은 방법은 그리드 벡터를 사용하는 것입니다. 그리드 벡터는 셀형 배열 {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')

마찬가지로, 원래 이미지보다 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')

보간 함수 F를 쿼리하여 이 확대된 이미지를 약 10배 더 높은 해상도로 다시 생성합니다. 여러 가지 다양한 보간 방법을 사용하여 결과를 비교합니다.

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')

참고 항목

|

관련 항목