Main Content

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

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

이미지 불러오기

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

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

Figure contains an axes object. The axes object contains an object of type image.

보간 생성하기

이미지에 대해 gridded interpolant 객체를 생성합니다. griddedInterpolant는 배정밀도 행렬과 단정밀도 행렬에만 사용할 수 있으므로 uint8 행렬을 double로 변환합니다. 이미지의 각 RGB 채널을 보간하려면 처음 두 차원의 샘플 점을 설명하는 두 개의 그리드 벡터를 지정하십시오. 그리드 벡터는 셀형 배열 {xg1,xg2,...,xgN}에서 열 벡터로 함께 그룹화됩니다. 이 정식화에서 griddedInterpolant는 3차원 행렬을 같은 그리드 위에 정의된 2차원 데이터 세트를 여러 개 포함하는 것으로 취급합니다.

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차원 이미지의 각 페이지를 평가합니다.

xq = (0:5/6:sz(1))';
yq = (0:5/6:sz(2))';
vq = uint8(F({xq,yq}));
imshow(vq)
title('Higher Resolution')

Figure contains an axes object. The axes object with title Higher Resolution contains an object of type image.

마찬가지로, 원래 이미지보다 55% 적은 개수의 점으로 보간 함수를 쿼리하여 이미지의 크기를 줄입니다. 원래 이미지 행렬의 요소를 참조하여 간단하게 더 낮은 해상도의 이미지를 생성할 수 있지만, 보간을 사용하면 정수가 아닌 픽셀 위치에서 이미지를 리샘플링할 수 있습니다.

xq = (0:1.55:sz(1))';
yq = (0:1.55:sz(2))';
vq = uint8(F({xq,yq}));
figure
imshow(vq)
title('Lower Resolution')

Figure contains an axes object. The axes object with title Lower Resolution contains an object of type image.

확대해서 생기는 아티팩트 매끄럽게 만들기

이미지를 확대해 나가면, 관심 영역의 픽셀이 점점 더 커지고 이미지의 디테일은 금세 사라지고 맙니다. 이미지 리샘플링을 사용하여 이와 같이 확대로 인해 생기는 아티팩트를 매끄럽게 할 수 있습니다.

원래 이미지의 중심에 있는 밝은 지점을 확대합니다. A의 요소를 다음과 같이 참조하는 이유는 이 밝은 지점을 이미지의 중앙에 오도록 하여 확대 후에도 프레임에서 벗어나지 않게 하려는 것입니다.

imshow(A(1:570,10:600,:),'InitialMagnification','fit')
zoom(10)
title('Original Image, 10x Zoom')

Figure contains an axes object. The axes object with title Original Image, 10x Zoom contains an object of type image.

보간 함수 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')

Figure contains an axes object. The axes object with title Linear method contains an object of type image.

F.Method = 'cubic';
vq = uint8(F({xq,yq}));
imshow(vq(1:5700,150:5900,:),'InitialMagnification','fit')
zoom(10)
title('Cubic method')

Figure contains an axes object. The axes object with title Cubic method contains an object of type image.

F.Method = 'spline';
vq = uint8(F({xq,yq}));
imshow(vq(1:5700,150:5900,:),'InitialMagnification','fit')
zoom(10)
title('Spline method')

Figure contains an axes object. The axes object with title Spline method contains an object of type image.

참고 항목

|

관련 항목