• 검색 결과가 없습니다.

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가 최선의 선택

참조

관련 문서

*단어 사이의 공통성과

두 쌍의 대각의 크기가 각각 같은

해설 교차로나 그 부근에서 긴급자동차가 접근하는 경우에는 차마와 노면전차의 운전자는 교차로를 피하여 일시정지 하여야 한다.. 27.> 모든 차와 노면전차의

본 연구원에서는 공개채용 서류접수와 관련하여 귀하의 개인정보를 아래와 같이 수집·이용하고자 합니다. 수집된 개인정보는 채용업무

멘토링 과정에서는 많은 어려움이 발생하기 때문에 초지일관 자신 감과참을성을 가지고 끈질기게 멘토링에 참여하는 것이 필요하다. 계획된 멘토링에 진지하고 헌신적으로

이렇게 작동을 하게 하려면 각 예제 폼들을 자식 윈 도우로 설정해야 하는데 그 방법으로는 다음과 같이 자식으로 생성될 폼 들의 속성을

[r]

그러므로 ㉥ ‘김 선생님’은 현재의 담화 상황에 참여하지 않는 인물을 지칭하는 표현이라는 설명은 적절하다.. 그러므로 ㉤이 아버지가 지금까지 은주와 나눈 대화의 화제