그리딩된 보간으로 이미지를 리샘플링하기
이 예제에서는 griddedInterpolant
를 사용하여 이미지의 픽셀을 리샘플링하는 방법을 보여줍니다. 이미지 리샘플링은 해상도와 크기를 조정하는 데 유용합니다. 이미지를 리샘플링하여 확대/축소 후에 픽셀을 평활화할 수도 있습니다.
이미지 불러오기
행성상성운 NGC 6543의 허블 우주 망원경 이미지인 ngc6543a.jpg
이미지를 불러와서 표시합니다. 이 이미지는 동심원 가스 껍질, 고속 가스 분출, 특이한 가스 매듭과 같은 여러 흥미로운 구조를 보여줍니다. 이미지를 나타내는 행렬 A
는 uint8
정수로 구성된 650×600×3 행렬입니다.
A = imread('ngc6543a.jpg');
imshow(A)
보간 생성하기
이미지에 대해 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')
마찬가지로, 원래 이미지보다 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')