이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

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)

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

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

patchVar = std2(patch)^2;

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

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

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

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

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

RGB 영상을 읽어 들입니다.

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

영상을 L*a*b 컬러스페이스로 변환하여 양방향 필터가 유사하게 지각되는 색을 스무딩하도록 합니다.

imLAB = rgb2lab(imRGB);

뚜렷한 경계를 포함하고 있지 않은 영역의 L*a*b 패치를 추출합니다. 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)])

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

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

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

입력 인수

모두 축소

필터링할 영상으로, 크기가 mxn인 2차원 회색조 영상 또는 mxnx3인 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입니다.

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

이름-값 쌍의 인수

선택적으로 Name,Value 인수가 쉼표로 구분되어 지정됩니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. Name은 따옴표 안에 표시해야 합니다. Name1,Value1,...,NameN,ValueN과 같이 여러 개의 이름-값 쌍의 인수를 어떤 순서로든 지정할 수 있습니다.

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

이웃 크기로, 'NeighborhoodSize'와 함께 홀수 값을 갖는 양의 정수가 쉼표로 구분되어 지정됩니다. 기본적으로 이웃 크기는 2*ceil(2*SpatialSigma)+1 픽셀입니다.

예: 'NeighborhoodSize',7

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

채우기로, 'Padding'과 함께 다음 값 중 하나가 쉼표로 구분되어 지정됩니다.

설명
'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에 개발됨