Main Content

imbilatfilt

가우스 커널을 사용한 영상 양방향 필터링

설명

J = imbilatfilt(I)는 회색조 또는 RGB 영상 I에 경계 보존 가우스 양방향 필터를 적용합니다.

J = imbilatfilt(I,degreeOfSmoothing)은 평활화의 양을 지정합니다. degreeOfSmoothing의 값이 작으면, imbilatfilt는 분산이 작은 이웃(균일한 영역)을 평활화하지만 강한 경계와 같이 분산이 큰 이웃은 평활화하지 않습니다. degreeOfSmoothing의 값이 증가하면 imbilatfilt는 균일한 영역 및 분산이 더 큰 이웃을 모두 평활화합니다.

예제

J = imbilatfilt(I,degreeOfSmoothing,spatialSigma)는 공간 가우스 평활화 커널의 표준편차 spatialSigma도 지정합니다. spatialSigma의 값이 클수록 더 먼 이웃 픽셀의 비중이 커져 사실상 이웃 크기가 늘어납니다.

J = imbilatfilt(___,Name,Value)는 이름-값 쌍을 사용하여 양방향 필터의 동작을 변경합니다.

예제

모두 축소

회색조 영상을 읽어 들이고 표시합니다. 하늘 영역에서 가로 방향의 줄무늬 아티팩트가 관찰됩니다.

I = imread('cameraman.tif');
imshow(I)

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

하늘 영역의 영상 패치를 검사합니다. 잡음 분산을 근사하는 패치 분산을 계산합니다.

patch = imcrop(I,[170, 35, 50 50]);
imshow(patch)

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

patchVar = std2(patch)^2;

양방향 필터링을 사용하여 영상을 필터링합니다. 평활화 정도를 잡음 분산보다 크게 설정합니다.

DoS = 2*patchVar;
J = imbilatfilt(I,DoS);
imshow(J)
title(['Degree of Smoothing: ',num2str(DoS)])

Figure contains an axes object. The hidden axes object with title Degree of Smoothing: 51.9395 contains an object of type image.

줄무늬 아티팩트가 줄었지만 완전히 제거되지는 않았습니다. 평활화를 향상하려면 spatialSigma의 값을 2로 늘리십시오. 그러면 가우스 평활화 커널에서 먼 이웃 픽셀의 비중이 커집니다. 그러면 양방향 필터의 공간 범위가 사실상 늘어납니다.

K = imbilatfilt(I,DoS,2);
imshow(K)
title(['Degree of Smoothing: ',num2str(DoS),', Spatial Sigma: 2'])

Figure contains an axes object. The hidden axes object with title Degree of Smoothing: 51.9395, Spatial Sigma: 2 contains an object of type image.

하늘의 줄무늬 아티팩트가 성공적으로 제거되었습니다. 사람의 실루엣 같은 뚜렷한 경계의 선명한 정도나 영상 전경의 풀처럼 텍스처가 있는 영역은 그대로 유지되어 있습니다.

RGB 영상을 읽어 들입니다.

imRGB = imread("coloredChips.png");
imshow(imRGB)

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

양방향 필터가 지각적으로 유사한 색을 평활화하도록 영상을 L*a*b* 컬러스페이스로 변환합니다.

imLAB = rgb2lab(imRGB);

뚜렷한 경계를 포함하고 있지 않은 영역의 패치를 추출합니다. L*a*b* 컬러스페이스에서 원점으로부터의 유클리드 거리의 분산을 계산합니다.

patch = imcrop(imLAB,[34,71,60,55]);
patchSq = patch.^2;
edist = sqrt(sum(patchSq,3));
patchVar = std2(edist).^2;

양방향 필터링을 사용하여 L*a*b* 컬러스페이스에서 영상을 필터링합니다. DegreeOfSmoothing을 패치의 분산보다 높은 값으로 설정합니다.

DoS = 2*patchVar;
smoothedLAB = imbilatfilt(imLAB,DoS);

영상을 다시 RGB 컬러스페이스로 변환하고 평활화된 영상을 표시합니다.

smoothedRBG = lab2rgb(smoothedLAB,"Out","uint8");
montage({imRGB,smoothedRBG})
title("Original Image vs. Filtered Image with Degree of Smoothing: "+num2str(DoS))

Figure contains an axes object. The hidden axes object with title Original Image vs. Filtered Image with Degree of Smoothing: 7.9771 contains an object of type image.

칩과 검정 펜에서는 색이 더 균일하게 나타나지만, 테이블에서는 가로 방향의 입자가 여전히 보입니다. 필터의 유효 이웃이 가로 방향 입자 사이의 공간(이 거리는 대략 7픽셀)을 포함하도록 필터의 공간 범위를 늘립니다. 이 영역을 더 과감하게 평활화하기 위해 DegreeOfSmoothing도 더 크게 합니다.

DoS2 = 4*patchVar;
sigma = 7;
smoothedLAB2 = imbilatfilt(imLAB,DoS2,sigma);
smoothedRBG2 = lab2rgb(smoothedLAB2,"Out","uint8");
montage({imRGB,smoothedRBG2})
title("Original Image vs. Filtered Image with Degree of Smoothing: "+num2str(DoS)+ ...
    " and Spatial Sigma: "+sigma)

Figure contains an axes object. The hidden axes object with title Original Image vs. Filtered Image with Degree of Smoothing: 7.9771 and Spatial Sigma: 7 contains an object of type image.

이웃과 평활화 정도를 더 크게 하니까 목재 테이블의 색이 더 균일해졌습니다. 칩과 펜의 경계 선명도는 그대로 유지되어 있습니다.

입력 인수

모두 축소

필터링할 영상으로, 크기가 m×n인 2차원 회색조 영상 또는 m×n×3인 2차원 컬러 영상으로 지정됩니다.

데이터형: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32

평활화 정도로, 양수로 지정됩니다. degreeOfSmoothing의 디폴트 값은 영상 I의 데이터형에 따라 달라지며 0.01*diff(getrangefromclass(I)).^2으로 계산됩니다. 예를 들어, 데이터형이 uint8형인 영상의 디폴트 평활화 정도는 650.25이고, 데이터형이 double형이고 픽셀 값이 [0, 1] 범위 내에 있는 영상의 디폴트 평활화 정도는 0.01입니다.

공간 영역에 대한 가우스 평활화 커널의 표준편차로, 양수로 지정됩니다.

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

예: imbilatfilt(I,NeighborhoodSize=7)은 7×7 픽셀 이웃을 사용하여 영상 I에 대해 양방향 필터링을 수행합니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: imbilatfilt(I,"NeighborhoodSize",7)은 7×7 픽셀 이웃을 사용하여 영상 I에 대해 양방향 필터링을 수행합니다.

이웃 크기로, 홀수 값을 갖는 양의 정수로 지정됩니다. 기본적으로 이웃 크기는 2*ceil(2*SpatialSigma)+1 픽셀입니다.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

채우기로, 다음 값 중 하나로 지정됩니다.

설명
"replicate"배열의 경계 밖에 있는 입력 배열 값은 가장 가까운 배열 테두리 값과 같은 것으로 간주됩니다.
"symmetric"

배열의 경계 밖에 있는 입력 배열 값은 배열 테두리를 기준으로 배열을 대칭 복사하여 계산됩니다.

숫자형 스칼라 x영상의 경계 밖에 있는 입력 영상 값에는 값 x가 할당됩니다.

예: Padding="symmetric"

예: Padding=128

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | char | string

출력 인수

모두 축소

필터링된 영상으로, 입력 영상 I와 크기 및 데이터형이 같은 숫자형 배열로 반환됩니다.

  • degreeOfSmoothing의 값은 양방향 필터에서 범위 가우스 커널의 분산에 해당합니다 [1]. 픽셀 값과 이웃의 값 사이의 유클리드 거리에 범위 가우스가 적용됩니다.

  • RGB 영상에서 지각적으로 가까운 색을 평활화하려면 양방향 필터를 적용하기 전에 rgb2lab을 사용하여 영상을 CIE L*a*b* 공간으로 변환하십시오. 결과를 보려면 lab2rgb를 사용하여 필터링된 영상을 RGB로 변환하십시오.

  • spatialSigma를 크게 하면 NeighborhoodSize가 커지며, 이로 인해 필터 실행 시간이 늘어납니다. NeighborhoodSize를 더 작은 값으로 지정하면 정확도는 낮아지지만, 실행 시간이 단축됩니다.

참고 문헌

[1] Tomasi, C., and R. Manduchi. "Bilateral Filtering for Gray and Color Images". Proceedings of the 1998 IEEE® International Conference on Computer Vision. Bombay, India. Jan 1998, pp. 836–846.

확장 기능

버전 내역

R2018a에 개발됨

모두 확장