• 검색 결과가 없습니다.

2.4 Spatial Filtering 2.4 Spatial Filtering

N/A
N/A
Protected

Academic year: 2022

Share "2.4 Spatial Filtering 2.4 Spatial Filtering"

Copied!
54
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

2.4 Spatial Filtering 2.4 Spatial Filtering

• Review - 이웃 처리의 단계: (§2.1, 그림 2.1;

§2.4, 그림 2.12)

i) 중앙 점 (x, y)를 정의

(2)

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

(3)

= 이웃 처리 or 공간 필터링(두 번째가 더 보편적)

• If 이웃 화소들에 대한 연산이 선형적,

선형 공간 필터링 (또는 공간 컨볼루션) Else

비선형 공간 필터링

• 선형 연산 = ?

(4)

2.4.1 선형 공간 필터링 2.4.1 선형 공간 필터링

i) 이웃 내 각 화소

대응 계수

,

– 이웃의 크기가 m  n 이면, mn 개의 계수

– 계수 배열 = 필터, 마스크, 필터 마스크, 커널, 템플릿, 윈도우, 컨볼루션 필터

ii) 그 결과들을

더해서

각 점 (x, y)에서의 응 답을 얻음 (g = ∑i

f

i

w

i)

~ 선형 연산

• 그림 2.13: 선형 공간 필터링 방법

(5)

 

1 1

) ,

( ) , ( )

,

(x y w i j f x i y j

g

(6)

1) 마스크 w의 중앙을 영상 f에서 한 점씩 이동 2) 각 점 (x, y)에서 필터의 응답 계산:

= ∑ (마스크 계수 * 대응 이웃 화소)

• m  n 마스크: m = 2a + 1, n = 2b + 1

– a, b: 음이 아닌 정수

 마스크 크기 = 홀수 ( 유일한 중앙점)

(그림 2.13)

(7)

goto

선형 공간 필터링 함수 imfilter ”

(8)

• 선형 공간 필터링을 수행할 때 분명하게 이해해야 할 두 가지 밀접한 개념:

1. 코릴레이션:

– 그림 2.13에 설명된 방식으로,

– 영상 배열 f 위로 마스크 w가 지나가면서 계 산

2. 컨볼루션:

–  correlation

– w가 f 위로 지나가기 전에 180 회전됨.

Correlation and Convolution

(9)

두 함수의 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))

(10)
(11)

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 위로 대신 움직였 다면?

(12)

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의 마지막 점 과 맞춰진 때

(13)

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)

(14)

• 그림 2.14의 함수 f = 이산, 단위 임펄스 함 수

• 그림 2.14(o) 또는 (p)  컨볼루션에 의해 임펄스 위치에

w가

“복사”됨

= 시프팅(sifting) 특성: 단순한 복사 특성

– 선형 시스템 이론의 근원적 개념이며,

– 컨볼루션에서 한 함수가 180 회전되는 이유

• 함수의 순서를 뒤집어도 같은 결과

• If 마스크 ~ 대칭,

컨볼루션 결과 == 코릴레이션 결과

Convolution의 Sifting 특성

(15)

• 앞의 개념을 영상에 대해 확장(그림 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)와 중첩.

영상으로의 확장

(16)
(17)

Convolution in 2 차원 Convolution in 2 차원

1) w(x, y)를 180

회전

2) 코릴레이션(그림 2.15(f) ~ (h))과 같은 방 식 진행

• 두 함수 중 어느 것을 이동시키는가에 상 관없이 같은 결과. (cf. 1차원 예제)

– 注: 코릴레이션에서는 달라짐.

• 그림 2.15(e) vs. (h): 공간 코릴레이션과 컨볼루션의 결과들은 서로 180 회전된 것.

 컨볼루션 == 회전된 필터 마스크를 사용 한 코릴레이션!

(18)

g

= imfilter(f, w,

filtering_mode

,

boundary_options, size_options

)

① f

: 입력; w: 마스크; g: 출력

② filtering_mode

: ‘corr’(~ default) or ‘conv’

(이하 표 2.3 )

선형 공간 필터링 함수 imfilter

(19)

③ boundary_options: 경계 패딩(border-padding)

경계의 두께  필터의 크기

패딩 옵션들: 표 2.3; 예제 2.8에서 자세히 설명

size_options: ‘same’ 또는 ‘full’(그림 2.14, 2.15)

(20)
(21)

• imfilter의 가장 보편적인 문법:

g =

g = imfilter imfilter(f, w, ‘replicate’) (f, w, ‘replicate’)

• IPT 표준 선형 공간 필터링 때 사용

– 이 필터들은 §2.5.1에서 설명; 미리 180 만큼 회전되어 있으므로, imfilter에 코릴레이션 디폴트 사용() 가능

• Corr. w/ 회전된 필터 == Conv. w/ 오리지널 필터  그 림 2.14

(22)

• 미리 회전되어 있지도 않고 대칭도 아닌 필터로 컨볼루션 할 때:

옵션 1. g = imfilter(f, w, ‘conv’, ‘replicate’) 옵션 2. rot90(w, 2) % w를 180 회전

imfilter(f, w, ‘replicate’) (= Corr.)

이들 두 단계를 하나의 명령문으로 통합 가능

 입력과 같은 크기의 영상 g를 만듦(∵ 디폴트 모 드 = ‘same’)

(23)

• 필터링되는 영상의 각 요소는 배정도 실수를 사 용해서 계산

그러나, imfilter는 출력 영상을 입력의 클래스로 전환

만일 f가 정수 배열이면,

 정수 형의 범위를 넘는 출력 요소들은 잘리며,

 소수점 아래 자리는 절삭

정확한 결과가 요구되면, imfilter를 사용하기 前 에 im2double/double을 사용해서 f를 클래스

double로 전환!

(24)

HW DIP0804DDs3.4.1-1

• 예제 2.8: imfilter 사용

– 중점 분석:

① boundary_options의 영향

② 입력 영상 f의 data class의 영향

– 그림 2.15

(25)

goto §2.4.2

• 주: 예제 2.8  Exam

(26)

예제 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))

(27)
(28)

필터 w와 컨볼루션시키면 희미해진 결과 기대

대칭 필터이므로 imfilter에 코릴레이션 사용 가능: 그림 2.16(b)

>> gd = imfilter(f, w); % 디폴트 경계 옵션 = 0 으로 패딩

>> imshow(gd, [ ])

 흑색과 백색 간의 경계선이 희미해짐.

Q: 영상의 밝은 부분과 경계 사이의 경계선도 희미해진 이유?

A: 패딩된 경계가 흑색(0)

Q: 해결책? -- A: ‘replicate’ 옵션으로 해결!

(29)

• 그림 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, [ ])

(30)

• 그림 2.16(e):

– 제로 패딩에서와 같은 문제  주기성

• 끝으로, “imfilter가 입력과 같은 클래스의 결과를 만든다”는 사실이 제대로 다뤄지지 않으면 어떤 문제를 야기? ()

(31)

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)

(32)

• 결과: 그림 2.16(f)

– class(w)  double

• 이유: 출력이 imfilter에 의해 입력의 클래 스(uint8)로 전환되었을 때, clipping에 의 해 데이타 손실

∑wij > 1  g(x, y) > 255 ~ 가능

• 해결책:

(1)마스크 정규화(wij

 (31)

2 합 = 1)

If 입력 ~ uint8

(33)

>> wn = w./(31^2);

>> grn = imfilter(f, wn, 'replicate'); % f ~ uint8

>> imshow(grn), figure, imshow(grn,[ ])

(34)

HW

HW 예제 예제 2.8 2.8 반복 반복

• 분석!

(35)

4.2 비선형 Spatial Filtering 4.2 비선형 Spatial Filtering

• Vs. 선형 공간 필터링:

– 共通: 이웃 연산에 기반; 중앙 점을 영상 위로 이 동시켜서 m  n 이웃을 정의

– 差異: 비선형 연산에 기반 (예: 최대 화소 값)

( 마스크 개념이 별로 적용되지 않음.)

(36)

• 툴박스 제공 비선형 필터링 함수:

1. nlfilter: 2-D에서 직접 연산 수행

2. colfilt: 데이타를

열 형태로 편성

– 한 화소 당 한 열

 더 많은 메모리를 필요로 하나, – 실행 속도 훨씬 빠름!

• Usu. 영상처리 응용에서 속도가 가장 우 선적 요소

 선호도: colfilt > nlfilter

(37)

colfilt colfilt

• Given: - 입력 영상(f) ~ 크기 M  N - 이웃 ~ 크기 m  n

• Then

최대 크기 mn  MN인 매트릭스(A)를 만듦:

영상 크기의 mn 배 (∵ MN = 화소 수)

– AA의 각각 열 = = 각각 화소화소 위치를위치를 중심으로중심으로 하는하는 이웃이웃 화소화소

• 예: 첫 열 = 이웃의 중앙이 f의 맨 왼쪽 위의 점일 때 이웃에 속하는 화소들

• 제로 패딩

(38)

g = colfilt(f, [m, n], ‘sliding’, fun)

• m, n: 필터 영역의 차원들(이웃의 크기)

• ‘sliding’  영상 f에서 m  n 영역을 한 화소씩 이동

fun : 함수 핸들(function handle). §1.7.8

colfilt의 문법

(39)

i) colfilt가 만든 A(~ mn  MN)의 각 열에 대해 개별적으로 연산 수행

ii) 결과: 행 벡터(v)

• v의 (최대) 크기 = 1  MN

 A에는 (최대) MN 개의 열

more about: 함수 fun

(40)

• colfilt에 의한 필터링 전에 입력 영상 패딩 필요

 2-D 함수 padarray를 사용:

fp = padarray(f,

[r, c], method, direction)

• f: 입력영상, fp: 패딩된 영상

• [r, c]는 f를 패딩할 행 및 열 수

• method, direction: 표 2.4 ()

colfilt와 padding

(41)
(42)

• 예: 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 생략  제로패딩

(43)

연습 연습

>> 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

(44)

>> 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]?

(45)

예제 2.9

비선형 공간 필터 구현하기 -- 함수 colfilt를 사용해서

예제 2.9

비선형 공간 필터 구현하기 -- 함수 colfilt를 사용해서

• 기하 평균(geometric mean) 필터 구현

– 어떤 점에서의 응답이 그 점을 중심으로 하는 이웃의 화소들의 밝기 값의 기하 평균

– 기하 평균 = mn 개 값들의 곱의 1/mn 제곱

• 이름을 gmean이라고 하자:

(46)

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

(47)

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]

행벡터 열벡터

(48)

사용자 함수 gmean

function v = gmean(A)

%GMEAN …

% …

mn = size(A, 1);

v = prod(A, 1).^(1/mn);

(49)

>> 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)

연습

(50)

Padding 방법을 바꿨다면?

(51)

>> size(f) ans =

512 512

>> size(fdp) ans =

532 532

>> size(g) ans =

532 532

(52)

fd

570 x 482

(53)

g

590 x 502

(54)

• 많이 사용되는 비선형 필터들 중 몇은 imfilter와

ordfilt2(2.5.2 절) 같은 MATLAB 및 IPT 함수들을 사용해 서 구현 가능.

– 예: 함수 spfilt는 예제 2.9의 기하 평균 필터를 imfilter와 MATLAB의 log 함수와 exp 함수를 사용해서 구현

• 이게 가능할 때, 성능은 항상 훨씬 빠르고, 메모리 사용은 colfilt를 사용할 때의 몇 분의 일에 불과

• 그러나, 이러한 대안적 구현이 없는 비선형 필터링 연산 에 대해서는 함수 colfilt가 최선의 선택

참조

관련 문서