2.4 Spatial Filtering 2.4 Spatial Filtering
• Review - 이웃 처리의 단계: (§2.1, 그림 2.1;
§2.4, 그림 2.12)
i) 중앙 점 (x, y)를 정의
ii) 마스크로 중앙 점의 이웃 화소들(예: 3 x 3)만을 선택해서 연산 수행:
iii) 연산 결과(= “응답(response)”) g(x, y) iv) If 영상의 마지막 점, Fin.
Else
중앙 점 이동; % 새 이웃 生成 GoTo ii)
1
1 1
1
) ,
( ) , ( )
, (
i j
j y
i x
f j i w y
x
g
= 이웃 처리 or 공간 필터링(두 번째가 더 보편적)
• If 이웃 화소들에 대한 연산이 선형적,
선형 공간 필터링 (또는 공간 컨볼루션) Else
비선형 공간 필터링
• 선형 연산 = ?
2.4.1 선형 공간 필터링 2.4.1 선형 공간 필터링
i) 이웃 내 각 화소
대응 계수,
– 이웃의 크기가 m n 이면, mn 개의 계수
– 계수 배열 = 필터, 마스크, 필터 마스크, 커널, 템플릿, 윈도우, 컨볼루션 필터
ii) 그 결과들을
더해서
각 점 (x, y)에서의 응 답을 얻음 (g = ∑if
iw
i)~ 선형 연산
• 그림 2.13: 선형 공간 필터링 방법
1 1
) ,
( ) , ( )
,
(x y w i j f x i y j
g
1) 마스크 w의 중앙을 영상 f에서 한 점씩 이동 2) 각 점 (x, y)에서 필터의 응답 계산:
= ∑ (마스크 계수 * 대응 이웃 화소)
• m n 마스크: m = 2a + 1, n = 2b + 1
– a, b: 음이 아닌 정수
마스크 크기 = 홀수 ( 유일한 중앙점)
(그림 2.13)
goto
“ 선형 공간 필터링 함수 imfilter ”
• 선형 공간 필터링을 수행할 때 분명하게 이해해야 할 두 가지 밀접한 개념:
1. 코릴레이션:
– 그림 2.13에 설명된 방식으로,
– 영상 배열 f 위로 마스크 w가 지나가면서 계 산
2. 컨볼루션:
– correlation
– w가 f 위로 지나가기 전에 180 회전됨.
Correlation and Convolution
두 함수의 Correlation -
1 차원 예제두 함수의 Correlation -
1 차원 예제• 그림 2.14(a): 1 차원 함수 f와 마스크 w
• f의 원점은 가장 왼쪽 점으로 가정
1) w를 이동시켜서 가장 右측의 점을 f의 원 점과 일치시킴: 그림 2.14(b)
2) 두 함수가 중첩되지 않는 점들이 있으면, f를 필요한 만큼 0으로 덧붙임(pad) w 를 f 위에서 이동시킬 때 항상 대응하는 점들이 있게 보장(그림 2.14(c))
3) 곱들의 합 계산:
– 그림 2.14(c)의 위치에서 = 0
– w를 한 점 우측으로 이동시키고 계산 = 0 (그림 2.14(d)).
– 그림 2.14(e): 처음으로 nonzero = (2)(1) = 2
4) w가 오리지널 f를 완전히 벗어날 때까지 반복(최종 모양: 그림 2.14(f))
코릴레이션
결과 = 그림 2.14(g)• w를 고정시키고 f를 w 위로 대신 움직였 다면?
Correlation options Correlation options
1. ‘full’: 그림 2.14(g)
– 出力 영상 크기 = 덧붙인 영상 크기 – 방금 설명한 방식으로 계산
2. ‘same’: 그림 2.14(h) -- f와 같은 크기로 만듦
– also 제로 패딩(zero padding) 사용 – But,
(1) 시작 위치는 마스크의 중앙 점(w의 3)이 f의 원점 과 맞춰진 때
(2) 마지막 계산은 마스크의 중앙 점이 f의 마지막 점 과 맞춰진 때
Now, convolution!
Now, convolution!
1) w를 180 회전(그림 2.14(i))
2) 회전된 마스크의 가장 우측 점을 f의 원점 에 위치시킨다(그림 2.14( j))
3) 코릴레이션에서 사용하는 슬라이딩/계산 과정을 반복(그림 2.14(k) ~ (n))
• ‘full’과 ‘same’ 컨볼루션 결과: 그림 2.14(o) 와 (p)
• 그림 2.14의 함수 f = 이산, 단위 임펄스 함 수
• 그림 2.14(o) 또는 (p) 컨볼루션에 의해 임펄스 위치에
w가
“복사”됨= 시프팅(sifting) 특성: 단순한 복사 특성
– 선형 시스템 이론의 근원적 개념이며,
– 컨볼루션에서 한 함수가 180 회전되는 이유
• 함수의 순서를 뒤집어도 같은 결과
• If 마스크 ~ 대칭,
컨볼루션 결과 == 코릴레이션 결과
Convolution의 Sifting 특성
• 앞의 개념을 영상에 대해 확장(그림 2.15)
• 코릴레이션:
1. w(x, y)의 右측 아래 점을 f(x, y)의 원점(첫 점)과 일치 (그림 2.15(c))
– 제로 패딩(그림 2.14 참조) 필요
2. w(x, y)를 가능한 모든 방향으로 이동시켜서 적 어도 한 요소가 오리지널 영상 f(x, y)와 중첩되 게.
• = ‘full’ 코릴레이션: 그림 2.15(d)
• ‘same’ 코릴레이션: 그림 2.15(e)
– w(x, y) 이동시 중앙 점이 오리지널 f(x, y)와 중첩.
영상으로의 확장
Convolution in 2 차원 Convolution in 2 차원
1) w(x, y)를 180회전
2) 코릴레이션(그림 2.15(f) ~ (h))과 같은 방 식 진행
• 두 함수 중 어느 것을 이동시키는가에 상 관없이 같은 결과. (cf. 1차원 예제)
– 注: 코릴레이션에서는 달라짐.
• 그림 2.15(e) vs. (h): 공간 코릴레이션과 컨볼루션의 결과들은 서로 180 회전된 것.
컨볼루션 == 회전된 필터 마스크를 사용 한 코릴레이션!
g
= imfilter(f, w,filtering_mode
,boundary_options, size_options
)① f
: 입력; w: 마스크; g: 출력② filtering_mode
: ‘corr’(~ default) or ‘conv’(이하 표 2.3 )
선형 공간 필터링 함수 imfilter
③ boundary_options: 경계 패딩(border-padding)
– 경계의 두께 필터의 크기
– 패딩 옵션들: 표 2.3; 예제 2.8에서 자세히 설명
④ size_options: ‘same’ 또는 ‘full’(그림 2.14, 2.15)
• imfilter의 가장 보편적인 문법:
g =
g = imfilter imfilter(f, w, ‘replicate’) (f, w, ‘replicate’)
• IPT 표준 선형 공간 필터링 때 사용
– 이 필터들은 §2.5.1에서 설명; 미리 180 만큼 회전되어 있으므로, imfilter에 코릴레이션 디폴트 사용() 가능
• Corr. w/ 회전된 필터 == Conv. w/ 오리지널 필터 그 림 2.14
• 미리 회전되어 있지도 않고 대칭도 아닌 필터로 컨볼루션 할 때:
옵션 1. g = imfilter(f, w, ‘conv’, ‘replicate’) 옵션 2. rot90(w, 2) % w를 180 회전
imfilter(f, w, ‘replicate’) (= Corr.)
– 이들 두 단계를 하나의 명령문으로 통합 가능
입력과 같은 크기의 영상 g를 만듦(∵ 디폴트 모 드 = ‘same’)
• 필터링되는 영상의 각 요소는 배정도 실수를 사 용해서 계산
그러나, imfilter는 출력 영상을 입력의 클래스로 전환
만일 f가 정수 배열이면,
정수 형의 범위를 넘는 출력 요소들은 잘리며,
소수점 아래 자리는 절삭
정확한 결과가 요구되면, imfilter를 사용하기 前 에 im2double/double을 사용해서 f를 클래스
double로 전환!
HW DIP0804DDs3.4.1-1
• 예제 2.8: imfilter 사용
– 중점 분석:
① boundary_options의 영향
② 입력 영상 f의 data class의 영향
– 그림 2.15
goto §2.4.2
• 주: 예제 2.8 Exam
예제 2.8 함수 imfilter 사용하기 예제 2.8 함수 imfilter 사용하기
• 그림 2.16(a): 512 512; 클래스 double ( im2double(f))
• 31 31 필터:
>> w = ones(31); % 312 평균 필터 (class(w) double)
(이 예제의 끝에서 클래스 uint8 형 영상에 대해 imfilter를 사 용할 때의 스케일링 효과를 보여주기 위해 계수를 (31)2으 로 나누지 않음.)(cf. 그림 2.16(f))
• 필터 w와 컨볼루션시키면 희미해진 결과 기대
• 대칭 필터이므로 imfilter에 코릴레이션 사용 가능: 그림 2.16(b)
>> gd = imfilter(f, w); % 디폴트 경계 옵션 = 0 으로 패딩
>> imshow(gd, [ ])
흑색과 백색 간의 경계선이 희미해짐.
Q: 영상의 밝은 부분과 경계 사이의 경계선도 희미해진 이유?
A: 패딩된 경계가 흑색(0)
Q: 해결책? -- A: ‘replicate’ 옵션으로 해결!
• 그림 2.16(c):
>> gr = imfilter(f, w, ‘replicate’);
>> figure, imshow(gr, [ ])
• 그림 2.16(d): ‘symmetric’ 옵션
>> gs = imfilter(f, w, ‘symmetric’);
>> figure, imshow(gs, [ ])
• 그림 2.16(e): ‘circular’ 옵션:
>> gc = imfilter(f, w, ‘circular’);
>> figure, imshow(gc, [ ])
• 그림 2.16(e):
– 제로 패딩에서와 같은 문제 주기성
• 끝으로, “imfilter가 입력과 같은 클래스의 결과를 만든다”는 사실이 제대로 다뤄지지 않으면 어떤 문제를 야기? ()
Fig. 2.16
>> f =
imread('Fig0315(a)(original_test_p attern).tif');
>> class(f) ans = uint8
>> fd = double(f); % [0, 250]
>> fdm = im2double(f); % [.0, .98]
>> max(fdm(:)), min(fdm(:)) ans = 0.9804
ans = 0
>> wn = w./(31^2);
>> g = imfilter(fdm, wn);
>> imshow(g), figure, imshow(g, [])
→ 그림 (b) 2 ea
>> g = imfilter(fdm,w);
>> imshow(g), figure, imshow(g, [])
→ 그림 (f), 그림 (b)
>> gdw = imfilter(fd, w);
>> imshow(gdw), figure, imshow(gd w,[ ])
→ 그림 (f), 그림 (b)
• 결과: 그림 2.16(f)
– class(w) double
• 이유: 출력이 imfilter에 의해 입력의 클래 스(uint8)로 전환되었을 때, clipping에 의 해 데이타 손실
∑wij > 1 g(x, y) > 255 ~ 가능
• 해결책:
(1)마스크 정규화(wij
(31)
2 합 = 1)If 입력 ~ uint8
>> wn = w./(31^2);
>> grn = imfilter(f, wn, 'replicate'); % f ~ uint8
>> imshow(grn), figure, imshow(grn,[ ])
HW
HW 예제 예제 2.8 2.8 반복 반복
• 분석!
4.2 비선형 Spatial Filtering 4.2 비선형 Spatial Filtering
• Vs. 선형 공간 필터링:
– 共通: 이웃 연산에 기반; 중앙 점을 영상 위로 이 동시켜서 m n 이웃을 정의
– 差異: 비선형 연산에 기반 (예: 최대 화소 값)
( 마스크 개념이 별로 적용되지 않음.)
• 툴박스 제공 비선형 필터링 함수:
1. nlfilter: 2-D에서 직접 연산 수행
2. colfilt: 데이타를
열 형태로 편성– 한 화소 당 한 열
더 많은 메모리를 필요로 하나, – 실행 속도 훨씬 빠름!
• Usu. 영상처리 응용에서 속도가 가장 우 선적 요소
선호도: colfilt > nlfilter
colfilt colfilt
• Given: - 입력 영상(f) ~ 크기 M N - 이웃 ~ 크기 m n
• Then
최대 크기 mn MN인 매트릭스(A)를 만듦:
영상 크기의 mn 배 (∵ MN = 화소 수) –
– AA의의 각각 열열 = = 각각 화소화소 위치를위치를 중심으로중심으로 하는하는 이웃이웃 화소화소 들
들
• 예: 첫 열 = 이웃의 중앙이 f의 맨 왼쪽 위의 점일 때 이웃에 속하는 화소들
• 제로 패딩
g = colfilt(f, [m, n], ‘sliding’, fun)
• m, n: 필터 영역의 차원들(이웃의 크기)
• ‘sliding’ 영상 f에서 m n 영역을 한 화소씩 이동
• fun : 함수 핸들(function handle). §1.7.8
colfilt의 문법
i) colfilt가 만든 A(~ mn MN)의 각 열에 대해 개별적으로 연산 수행
ii) 결과: 행 벡터(v)
• v의 (최대) 크기 = 1 MN
A에는 (최대) MN 개의 열
more about: 함수 fun
• colfilt에 의한 필터링 전에 입력 영상 패딩 필요
2-D 함수 padarray를 사용:
fp = padarray(f,
[r, c], method, direction)
• f: 입력영상, fp: 패딩된 영상
• [r, c]는 f를 패딩할 행 및 열 수
• method, direction: 표 2.4 ()
colfilt와 padding
• 예: f = [1 2; 3 4] 일 때,
>> fp = padarray(f, [3 2], 'replicate', 'post')
fp = 1 2 2 2
3 4 4 4
3 4 4 4
3 4 4 4
3 4 4 4
• direction의 디폴트: ‘both’
• method 생략 제로패딩
연습 연습
>> fp = padarray(f, [3 2], 'replicate', 'pre')
>> fp = padarray(f, [3 2], 'replicate', 'both')
>> fp = padarray(f, [3 2], 'circular', 'post') %
주기
1 2 1 2 3 4 3 4 1 2 1 2 3 4 3 4 1 2 1 2
>> fp = padarray(f, [3 2], 'symmetric', 'post')
1 2 2 1 3 4 4 3 3 4 4 3 1 2 2 1 1 2 2 1
What if [4 2]?
예제 2.9
비선형 공간 필터 구현하기 -- 함수 colfilt를 사용해서예제 2.9
비선형 공간 필터 구현하기 -- 함수 colfilt를 사용해서• 기하 평균(geometric mean) 필터 구현
– 어떤 점에서의 응답이 그 점을 중심으로 하는 이웃의 화소들의 밝기 값의 기하 평균
– 기하 평균 = mn 개 값들의 곱의 1/mn 제곱
• 이름을 gmean이라고 하자:
1) ‘replicate’로 입력 패딩: (경계 효과 )
>> f = padarray(f, [m n], 'replicate'); % M N 2) colfilt 호출:
>> g = colfilt(f, [m n], ‘sliding’, @gmean);
i) colfilt는 mn MN 매트릭스(A) 를 만들어서, ii) 함수 핸들을 사용해서 gmean에 넘겨줌
iii) gmean은 A의 모든 개별적 열에 대한 연산 결 과를 포함하는 행 벡터(1 MN)를 반환!:
function v = gmean(A)
by using colfilt
3) 함수 prod를 이용해서 기하 평균 계산:
>> help prod
PROD Product of elements.
For vectors, PROD(X) is the product of the elements of X. For matrices, PROD(X) is a row vector with the product over each column. PROD(X,DIM) works along the dimension DIM.
Example: If X = [0 1 2 3 4 5]
then prod(X,1) is [0 4 10] and prod(X,2) is [ 0 60]
행벡터 열벡터
사용자 함수 gmean
function v = gmean(A)
%GMEAN …
% …
…
mn = size(A, 1);
v = prod(A, 1).^(1/mn);
>> f = imread('Fig0315(a)(original_test_pattern).tif');
>> fd = im2double(f);
>> fdp = padarray(fd, [10 10], 'replicate');
>> g = colfilt(fdp, [10 10], 'sliding', @gmean);
% gmean의 인자 불필요 ∵ (p. 12)
>> imshow(f), figure, imshow(fdp), figure, imshow(g)
연습
Padding 방법을 바꿨다면?
>> size(f) ans =
512 512
>> size(fdp) ans =
532 532
>> size(g) ans =
532 532
fd
570 x 482
g
590 x 502
• 많이 사용되는 비선형 필터들 중 몇은 imfilter와
ordfilt2(2.5.2 절) 같은 MATLAB 및 IPT 함수들을 사용해 서 구현 가능.
– 예: 함수 spfilt는 예제 2.9의 기하 평균 필터를 imfilter와 MATLAB의 log 함수와 exp 함수를 사용해서 구현
• 이게 가능할 때, 성능은 항상 훨씬 빠르고, 메모리 사용은 colfilt를 사용할 때의 몇 분의 일에 불과
• 그러나, 이러한 대안적 구현이 없는 비선형 필터링 연산 에 대해서는 함수 colfilt가 최선의 선택