Main Content

크기 조정 보간 커널을 만들고 비교하기

이 예제에서는 이미지 크기 조정을 위한 커널을 정의하고 샘플 이미지에서 서로 다른 보간 커널을 비교하는 방법을 보여줍니다.

보간 커널은 인접한 픽셀 값의 가중 평균을 사용하여 픽셀 값을 계산합니다. imresize 함수는 쌍선형, 쌍삼차, Lanczos 리샘플링을 수행하는 여러 내장 커널을 제공합니다. 사용자 지정 커널을 정의한 다음 이를 사용하여 이미지 크기를 조정할 수도 있습니다.

보간 커널을 평가하고 비교하기 위해 이 예제에서는 각 커널을 사용하여 작은 이미지를 확대합니다. 보간 커널의 성능을 완전히 평가하려면 다양한 이미지와 스케일링 인자를 검토해야 합니다.

imresize 보간 방법을 기반으로 커널 만들기

쌍선형 방법은 다음과 같이 정의되는 삼각 보간 커널을 사용합니다.

f(x)={1-|x||x|10otherwise

triangleResampling 함수를 사용하여 쌍선형 보간 커널을 만듭니다. 이 함수는 이 예제의 끝에 나와 있는 헬퍼 함수 섹션에 정의되어 있습니다. 그런 다음 [-3.5, 3.5] 이웃에 대한 쌍선형 보간 커널을 표시합니다.

nhood = [-3.5 3.5];
fplot(@triangleResampling,nhood)
title("Bilinear (Triangular) Interpolation Kernel")

Figure contains an axes object. The axes object with title Bilinear (Triangular) Interpolation Kernel contains an object of type functionline.

쌍삼차 방법은 다음의 조각별 3차 보간 커널을 사용합니다.

f(x)={1.5|x|3-2.5|x|2+1|x|1-0.5|x|3+2.5|x|2-4|x|+21|x|20otherwise

bicubicResampling 헬퍼 함수를 사용하여 쌍삼차 보간 커널을 만듭니다. 이 함수는 이 예제의 끝에 나와 있는 헬퍼 함수 섹션에 정의되어 있습니다. 그런 다음 쌍삼차 보간 커널을 표시합니다.

fplot(@bicubicResampling,nhood)
title("Bicubic Interpolation Kernel")

Figure contains an axes object. The axes object with title Bicubic Interpolation Kernel contains an object of type functionline.

lanczos2lanczos3 커널은 Lanczos 계열의 보간 커널을 기반으로 합니다. Lanczos 커널은 다음과 같이 정의되며 각각 a=2 또는 a=3입니다.

f(x)={sinc(x)sinc(x/a)|x|a0otherwise

lanczosResampling 함수를 사용하고 인자 a를 지정하여 lanczos2 및 lanczos3 보간 커널을 만듭니다.

lanczos2 = @(x) lanczosResampling(x,2);
lanczos3 = @(x) lanczosResampling(x,3);

lanczos2lanczos3 보간 커널을 표시합니다.

fplot(lanczos2,nhood)
hold on
fplot(lanczos3,nhood)
hold off
legend(["Lanczos 2","Lanczos 3"])
title("lanczos2 and lanczos3 Interpolation Kernels")

Figure contains an axes object. The axes object with title lanczos2 and lanczos3 Interpolation Kernels contains 2 objects of type functionline. These objects represent Lanczos 2, Lanczos 3.

사용자 지정 보간 커널 정의하기

접촉 유리 보간(osculatory rational interpolation)[1]에 기반한 조각별 유리 함수를 고려해 보겠습니다.

f(x)={-0.168|x|2-0.9129|x|+1.0808|x|2-0.8319|x|+1.0808|x|10.1953|x|2-0.5858|x|+0.3905|x|2-2.4402|x|+1.76761<|x|202<|x|

oscResampling 함수를 사용하여 접촉 유리 보간을 수행하는 사용자 지정 보간 커널을 만듭니다. 이 함수는 이 예제의 끝에 나와 있는 헬퍼 함수 섹션에 정의되어 있습니다. 그런 다음 사용자 지정 보간 커널을 표시합니다.

fplot(@oscResampling,nhood)
title("Custom Osculatory Rational Interpolation Kernel")

Figure contains an axes object. The axes object with title Custom Osculatory Rational Interpolation Kernel contains an object of type functionline.

보간 커널을 사용하여 이미지 크기 조정하기

작은 아이콘 이미지를 100% 배율로 읽고 표시합니다.

A = imread("region-analyzer-icon.png");
imshow(A,"InitialMagnification",100)

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

각각의 내장 보간 방법을 사용하여 인자 f로 이미지 크기를 조정합니다. 최근접이웃 방법은 이웃 픽셀의 가중 평균을 취하지 않습니다. 대신 최근접이웃 방법은 가장 가까운 입력 픽셀의 값을 출력 픽셀에 할당합니다.

f = 10;
B_nearest = imresize(A,f,'nearest');
B_bilinear = imresize(A,f,'bilinear');
B_bicubic = imresize(A,f,'bicubic');
B_lanczos2 = imresize(A,f,'lanczos2');
B_lanczos3 = imresize(A,f,'lanczos3');

사용자 지정 커널을 사용하여 이미지의 크기를 조정하기 위해, imresizemethod 인수로 함수 핸들과 0이 아닌 커널 너비를 지정합니다.

width = 4;
B_osc = imresize(A,f,{@oscResampling,width});

크기가 조정된 이미지를 타일 형식 이미지로 표시하고 결과를 주관적으로 비교합니다.

최근접이웃 결과(왼쪽 위)에서는 블록화 현상이 나타납니다. 쌍선형 결과(가운데 위)는 최근접이웃 결과보다 대부분의 측면에서 더 낫지만 다소 흐리게 보입니다. 쌍삼차 결과(오른쪽 위)와 lanczos2 결과(왼쪽 아래)는 매우 유사해 보이며 쌍선형 결과보다 더 뚜렷합니다. 예를 들어, 이미지 상단의 숫자 "3"과 "8"을 자세히 살펴보십시오. lanczos3 결과(가운데 아래)는 쌍삼차 결과와 lanczos2 결과보다 더 뚜렷하지만 가시적인 "링잉 현상" 아티팩트를 보입니다. 링잉 현상 아티팩트는 회색 경계 외부에서 희미한 에코로 나타나거나 이미지의 중간을 따라 내려가는 두꺼운 검은색 줄무늬의 왼쪽과 오른쪽을 보면 알 수 있습니다.

사용자 지정 보간 결과(오른쪽 아래)는 쌍삼차 결과와 lanczos2 결과보다 약간 더 뚜렷하고 대각 모서리가 약간 더 매끄럽습니다. 사용자 지정 보간 결과에서는 링잉 현상 아티팩트가 보이지 않습니다.

t = imtile({B_nearest,B_bilinear,B_bicubic, ...
    B_lanczos2,B_lanczos3,B_osc},BackgroundColor="white");
imshow(t)

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

헬퍼 함수

triangleResampling 헬퍼 함수는 쌍선형 보간을 수행합니다.

function f = triangleResampling(x)
    f = (1 - abs(x)) .* (abs(x) <= 1);
end

bicubicResampling 헬퍼 함수는 쌍삼차 보간을 수행합니다.

function f = bicubicResampling(x)
    absx = abs(x);
    absx2 = absx.^2;
    absx3 = absx.^3;
    
    f = (1.5*absx3 - 2.5*absx2 + 1) .* (absx <= 1) + ...
        (-0.5*absx3 + 2.5*absx2 - 4*absx + 2) .* ...
        ((1 < absx) & (absx <= 2));
end

lanczosResampling 헬퍼 함수는 지정된 인자 a를 사용하여 Lanczos 보간을 수행합니다.

function f = lanczosResampling(x,a)
    f = a*sin(pi*x) .* sin(pi*x/a) ./ ...
        (pi^2 * x.^2);
    f(abs(x) > a) = 0;
    f(x == 0) = 1;
end

oscResampling 헬퍼 함수는 접촉 유리 보간을 수행합니다.

function f = oscResampling(x)
    absx = abs(x);
    absx2 = absx.^2;
    
    f = (absx <= 1) .* ...
        ((-0.168*absx2 - 0.9129*absx + 1.0808) ./ ...
        (absx2 - 0.8319*absx + 1.0808)) ...
        + ...
        ((1 < absx) & (absx <= 2)) .* ...
        ((0.1953*absx2 - 0.5858*absx + 0.3905) ./ ...
        (absx2 - 2.4402*absx + 1.7676));
end

참고 문헌

[1] Hu, Min, and Jieqing Tan. "Adaptive Osculatory Rational Interpolation for Image Processing." Journal of Computational and Applied Mathematics 195, no. 1–2 (October 2006): 46–53. https://doi.org/10.1016/j.cam.2005.07.011.

참고 항목