• 검색 결과가 없습니다.

• g = rgb2gray(f); Tip: 칼라영상  흑백영상

N/A
N/A
Protected

Academic year: 2022

Share "• g = rgb2gray(f); Tip: 칼라영상  흑백영상"

Copied!
68
0
0

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

전체 글

(1)

Tip: 칼라 영상  흑백 영상

• g = rgb2gray(f);

cafe.daum.net/RobotVision 1

(2)

dipum2 dipum2

CH 2 CH 2

IntensityTransformations

IntensityTransformations & &

SpatialFiltering SpatialFiltering

2 cafe.daum.net/RobotVision

(3)

개요

• 공간 도메인 처리의 두 가지 주요 부류에

초점:

1. 밝기

(or

그레이-레벨

)

변환

2. 공간 필터링

:

이웃 처리

(or

공간 컨볼루션

)

• 위의 두 부류의 대표적인 처리 기법들을 개발

• 이 장의 대부분의 예제들

 영상 enhancement

3 cafe.daum.net/RobotVision

(4)

• 공간 도메인 기법은 영상의

화소들에 직접 작용

• 공간 도메인 처리

:

g(x, y) = T [ f(x, y) ]

f(x, y):

入力 영상

g(x, y):

出力 영상

T:

점 (

x, y

) 주위의

이웃

(그림 2.1)에 대해 정의되는 연산자

• 複數 영상에 대한 연산 가능 – 예: 노이즈 경감을 위해 K

의 영상을 더하는 것

1 배경 1 배경

4 cafe.daum.net/RobotVision

(5)

이웃 이웃

• 어떤 점 (x,y)의

공간적 이웃

(그림 2.1 )

= (x,y)를 중심으로 하는 주로 정사각형 영역

• (공간) 이웃 처리:

i) 이웃의

중심

을 영상의 좌측 위 모서리에 놓고, ii) 연산:

g

(

x

,

y

)

=

T[

f

(

x

,

y

)] (어떤 연산? 그림 )

– 이웃 화소들 을 (x, y)에서의 g 값의 계산에 사용

iii) 이웃의 중심

을 한 화소

이동

하고 goto ‘step ii’.

– 이동할 때마다 이웃 달라짐

(6)

그림 2.1 (x, y)의 3  3 이웃 그림 2.1 (x, y)의 3  3 이웃

 

1

1 1

1

) ,

( ) , ( )]

, ( [ )

, (

i j

j y

i x

f j i w y

x f T y

x g

) 1 , 1 ( )

0 , 1 ( )

1 , 1 (

) 1 , 0 ( )

0 , 0 ( )

1 , 0 (

) 1 , 1 ( )

0 , 1 ( )

1 , 1 (

w w

w

w w

w

w w

w W

6 cafe.daum.net/RobotVision

(7)

7 cafe.daum.net/RobotVision

(8)

8 cafe.daum.net/RobotVision

(9)

• 이 장의 나머지에서는 앞의

(공간 도메인 처리)

식 을 다양하게 구현

– 개념 ~ 간단

– 주의:

MATLAB에 의해 구현 時

데이타 클래스 와 값의 범위

에 주의.

9 cafe.daum.net/RobotVision

(10)

• 가장 간단한 형태의

T:

그림 2.1의 이웃의 크기 가 1  1(

단일 화소

)일 때(즉, W = w (= w(0,0)

~ scalar)). 이 경우,

① g(x, y) = T[f(x,y)] = w  f(x,y)

② 즉, T =

밝기 or 그레이 레벨 변환 함수

 그 점에서의

f의 밝기에만 의존

• 밝기 변환 함수가 밝기 값에만 종속 (좌표(x, y) 와 無關) 

g(x, y) = T[f(x,y)]  g = T[ f ]

 s = T(r)

– r, s: 각각 f와 g의 해당 점(x, y)에서의

밝기 2 Intensity Transformation Functions 2 Intensity Transformation Functions

10 cafe.daum.net/RobotVision

(11)

• 그레이 영상의 밝기 변환을 위한 기본적인 IPT 툴:

g = imadjust(f, [low_in high_in],

[low_out high_out], gamma)

• [low_in, high_in]  [low_out, high_out]

• clipping: (그림 3.2)

2.2.1 imadjust & stretchlim

2.2.1 imadjust & stretchlim

(12)

Photoshop:

Image > Adjustment > Curves…

(13)

1. 입력 영상 클래스: uint8, uint16, int16, single, double

출력 영상 클래스 = 입력 영상 클래스

2. 2nd & 3rd 인자 ~ [0, 1] (f의 클래스와 무관) – If f ~ uint8, * 255

If f ~ uint16, * 65535

– If [

low_in high_in

], [

low_out high_out

] ~ 빈 매트릭스([ ]), 디폴트 = [0 1]

• Q: What if high_out < low_out?

(imadjust) (imadjust)

13 cafe.daum.net/RobotVision

(14)

또는, via 메뉴: Image > Adjustment > Invert

네거티브

PhotoShop

(15)

3. gamma: 곡선의 모양을 규정

– If gamma < 1 (그림 2.2(a)), 출력 밝기  (Why?)

If gamma > 1, 출력 밝기 

만일 생략하면, gamma = 1 (선형 매핑).

(함수 imadjust) (함수 imadjust)

15 cafe.daum.net/RobotVision

(16)

• 그림 2.3(a): 작은 종양이 보이는 매모그램 영상(f)

• 그림 2.3(b): 네거티브 영상

>> g1 = imadjust(f, [0 1], [1 0]);

∵ 특히

넓고 어두운 영역 속의 백색 또는 회색 디 테일을 보는 것 보다 그

反對로 보는 것이 편리

 그림 2.3(b)에서의 가슴 조직 분석이 훨씬 더 쉬 워짐.

• Alternative:

g = imcomplement(f) 

IPT

예제 2.1 함수 imadjust 사용하기 예제 2.1 함수 imadjust 사용하기

16 cafe.daum.net/RobotVision

(17)

17 cafe.daum.net/RobotVision

(18)

• 그림 2.3(c):

>> g2 = imadjust(f, [0.5 0.75], [0 1]);

– [0.5, 0.75]  [0, 1]

로 확장 (나머지 입력 범위는?)

 관심 대상 밝기 범위를 강조

• 그림 2.3(d):

>> g3 = imadjust(f, [ ], [ ], 2);

– 그레이 스케일의 아래 끝은

압축

; 위 끝은

확 장

(그림 2.2(c))

– Vs. 그림 2.3(c): 회색 톤 증가

(함수 imadjust) (함수 imadjust)

18 cafe.daum.net/RobotVision

(19)

그림 (c) vs. (d)

19 cafe.daum.net/RobotVision

(20)

histograms

(21)

stretchlim

Low_High = stretchlim(f)

• By default, values in Low_High specify the intensity levels that saturate the bottom and top 1% of all pixel values in f.

• >> g = imadjust(f, stretchlim(f), [ ]);

• >> g = imadjust(f, stretchlim(f), [1 0]);

21 cafe.daum.net/RobotVision

(22)

• Low_High = stretchlim(f, tol)

– tol = [low_frac high_frac]

• If tol ~ scalar ,

low_frac = tol

high_frac = 1 − low_frac

• If you omit it from the argument,

tol = [0.01 0.99]  saturation level = 2%.

• If tol = 0  Low_High = [min(f(:)) max(f(:))]

22 cafe.daum.net/RobotVision

(23)

• 로그 변환 함수:

g = c*log(1 + double(f)) (c: 상수) ()

• Vs. gamma 곡선:

1. gamma < 1인 곡선(그림 2.2(a))에서 밑의 값을 0, 위의 값을 1로 설정한 것과 비슷.

2. gamma 곡선의 모양 ~ 가변적, 로그 함수의 모양 ~ 고정.

2.2 로그 및 콘트라스트-스트레칭 변환 2.2 로그 및 콘트라스트-스트레칭 변환

23 cafe.daum.net/RobotVision

(24)

24 cafe.daum.net/RobotVision

(25)

• 주요 용도: 동적 범위 축소

• 예: 푸리에 스펙트럼(CH 3)

(로그 변환 함수) (로그 변환 함수)

25 cafe.daum.net/RobotVision

(26)

>> g = c*log(1 + double(f)) 後,

>> gs = im2uint8(mat2gray(g));

– mat2gray  [0, 1]  im2uint8  [0, 255]

26 cafe.daum.net/RobotVision

(27)

• 그림 2.4(a):

콘트라스트- 스트레칭

변환함수

∵ (1) For r < m, 출력 영상에서 좁은 범위의 더 어두운 레벨에 압축;

(2) For r > m, 좁은 범위의 더 밝은 레벨에 압축

 분포를 양 극 으로 벌림 (

dynamic range )

• 그림 2.4(b): 극단적 경우; 출력 ~

이진 영상

= thresholding

함수

– 영상

분할

에 사용 (cf. CH 10)

27 cafe.daum.net/RobotVision

(28)

28 cafe.daum.net/RobotVision

(29)

그림 2.4(a)의 함수 그림 2.4(a)의 함수

• 그림 2.4(a)의 함수: s = T(r) =

r, s: 각각 입력 영상, 출력 영상에서의 밝기 (@ 한 화소)

• E: 기울기 조절 (= 20 in 그림 2.4(a))

– If E ~ very large, … ? (그려 볼 것.)

• 전체 영상에 대한 공식:

g = 1../(1 + (m../(double(f ) + eps))..^E)

r E

m/ ) ( 1

1

r

E

m / ) (

1

1

29 cafe.daum.net/RobotVision

(30)

• eps ?

• T(r)의 한계 값(최대) = 1

 출력 값 ~ [0, 1]로 스케일링

30 cafe.daum.net/RobotVision

(31)

예제 2.2: 동적 범위 축소 위해 로그 변환 사용하기

예제 2.2: 동적 범위 축소 위해 로그 변환 사용하기

• 그림 2.5(a): [0, 1.5 

10

6]의 푸리에 스펙트럼

– 즉, 1.5  10

6

 255; 1.5  10

3 → 0.255  0

• 그림 2.5(b):

>> g = im2uint8(mat2gray(log(1 + double(f))));

>> imshow(g)

– Vs. 오리지널 영상: 개선 분명

어두운 영역의 변화는 강조; 밝 은 영역의 변화 는 억제.

31 cafe.daum.net/RobotVision

(32)

! 비교:

>> imshow(mat2gray(log(1 + double(f))));

(33)

g = im2uint8(mat2gray(log(1 + double(f))));

(34)

• HW: (HW 2.2.2)

34 cafe.daum.net/RobotVision

(35)

2.2.3 Specifying Arbitrary Intensity Transformations

• g = interp1(z, T, f)

35 cafe.daum.net/RobotVision

(36)

2.2.4 밝기 변환을 위한 유틸리티 M-함수 2.2.4 밝기 변환을 위한 유틸리티 M-함수

• In this section, 앞의 두 절에서 소개된 밝 기 변환의 다양한 측면을 統合하는 두 개 의 M-함수를 개발

36 cafe.daum.net/RobotVision

(37)

• 함수

nargin: (

함수의 本文에서

) n = nargin

– M-함수에 입력되는 인자의 실제 갯수 반환

 함수 nargout: (출력 인자 수) n = nargout

• 예:

>> T = testhv(4, 5); % a hypothetical M-function

– 함수 本文에서, nargin은 2를, nargout은 1을 반환.

가변적인 입력 및 출력 개수 다루기 가변적인 입력 및 출력 개수 다루기

37 cafe.daum.net/RobotVision

(38)

• 옳은 수의 인자가 넘겨졌는지 확인 (함수 본문 내에서) msg = nargchk(low, high, number) % number ← nargin

• If number < low, “Not enough input parameter”

> high, “Too many input parameters” 반환 in between, then 빈 매트릭스를 반환.

• 사용 예: error(nargchk(2, 3, nargin));

함수 nargchk 함수 nargchk

38 cafe.daum.net/RobotVision

(39)

function G = testhv2(x, y, z) ...

error(nargchk(2, 3, nargin));

...

• 예:

>> testhv2(6);

Not enough input arguments.

then 실행 중단.

보기 보기

39 cafe.daum.net/RobotVision

(40)

• 변수 varargin과 varargout

• 예:

function [m, n] = testhv3(varargin)

 입력 인자 수 ~ 可變的

function [varargout] = testhv4(m, n, p)

 출력 인자 수 ~ 가변적

• 입력과 출력 인자 수가 모두 가변적인 함 수도 가능.

변수 varargin과 varargout 변수 varargin과 varargout

40 cafe.daum.net/RobotVision

(41)

고정

고정 인자와 인자와 가변 가변 인자가 인자가 혼재하는 혼재하는 경우 경우

• 예: If testhv5가

① 고정 입력 인자

= 1개(x), and

② 가변적 입력 인자 를 갖는다면,

function [m, n] = testhv5(x, varargin)

 두 번째 입력 인자부터 varargin이 시작.

41 cafe.daum.net/RobotVision

(42)

• varargin ~

쎌 배열

 혼합된 입력 집합 포함 가능

• 예:

>> [m, n] = testhv5(f, [0 0.5 1.5], A, ‘label’);

– (1) 영상; (2) 길이 3의 행 벡터; (3) 매트릭스; (4) 문자열

• 다양한 입력을 필요로 하는

함수의 구조를 단순화

!!

How is it possible? Ans) cell array

42 cafe.daum.net/RobotVision

(43)

밝기

밝기 변환을 변환을 위한 위한 M M--함수 함수 2 2

• In this section, 다음 변환 함수들을 계산 하는 함수 개발 : negative, log, gamma, contrast-stretching.

• + 이 함수 작성에 함수 tofloat 사용:

[g, revertclass] = tofloat(f)

注: 문서화가 안된

IPT 유틸리티 함수. 그 코드는 부록

C에.

– logical, uint8, uint16, int16  single – revertclass:

function handle

• to covert the output back to the same class as f

43 cafe.daum.net/RobotVision

(44)

• 함수 intrans에서 코드의 도움말 섹션에서

1. 함수 옵션들이 어떻게 포맷되고,

2. 가변 개수 입력들이 어떻게 다뤄지고, 3. 에러 확인이 코드에 어떻게 삽입되며,

4. 지정된 클래스에 출력 영상의 클래스가 어떻게 맞춰 지는지

를 주목.

• Remember: varargin ~ 쎌 배열  요소 선택 時

중괄호

사용!

함수 intrans

(intensity transformation) 함수 intrans

(intensity transformation)

44 cafe.daum.net/RobotVision

(45)

function g = intrans(f, method, varargin)

%INTRANS Performs intensity (gray-level) transformations.

% G = INTRANS(F, ‘neg’) computes the negative of input image F.

%

% G = INTRANS(F, ‘log’, C, CLASS) computes C * log(1 + F). If the last two parameters are omitted, C defaults to 1. Because the log is used

% frequently to display Fourier spectra, parameter CLASS offers the

% option to specify the class of the output as ‘uint8’ or

% ‘uint16’. If parameter CLASS is omitted, the output is of the

% same class as the input.

%

45 cafe.daum.net/RobotVision

g = c*log(1 + double(f))

(46)

% G = INTRANS(F, ‘gamma’, GAM) …

%

% G = INTRANS(F, ‘stretch’, M, E) computes a contrast-stretching

% trasformation using …

% (default values: …)

% G = INTRANS(F, 'specified', TXFUN) performs the intensity

% transformation s = TXFUN(r) where r are input intensities, s are

% output intensities, and TXFUN is an intensity transformation

% (mapping) function, expressed as a vector with values in the

% range [0, 1]. TXFUN must have at least two values.

% For the …

r E

m / ) (

1

1

46 cafe.daum.net/RobotVision

(47)

% Verify the correct number of inputs.

error(nargchk(2, 4, nargin)) % nargchk  message

if strcmp(method, 'log')

% The log transform handles image classes differently than the

% other transforms, so let the logTransform function handle that

% and then return.

g = logTransform(f, varargin{:});

return;

end

47 cafe.daum.net/RobotVision

(48)

% If f is floating point, check to see if it is in the range [0 1].

% If it is not, force it to be using function mat2gray.

if isfloat(f) && (max(f(:)) > 1 || min(f(:)) < 0) f = mat2gray(f);

end

[f, revertclass] = tofloat(f); %Store class of f for use later.

% Perform the intensity transformation specified.

48 cafe.daum.net/RobotVision

(49)

switch method case ‘neg’

g = imcomplement(f);

case 'gamma'

g = gammaTransform(f, varargin{:});

case 'stretch'

g = stretchTransform(f, varargin{:});

case 'specified'

g = spcfiedTransform(f, varargin{:});

otherwise

error('Unknown enhancement method.') End

% Convert to the class of the input image.

g = revertclass(g);

• switch-case 예:

switch (rem(n,4)==0) + (rem(n,2)==0) case0

M = odd_magic(n) case 1

M = single_even_magic(n) case 2

M = double_even_magic(n) otherwise

error('This is impossible') end

49 cafe.daum.net/RobotVision

(50)

%---%

function g = gammaTransform(f, gamma) g = imadjust(f, [ ], [ ], gamma);

%---%

function g = stretchTransform(f, varargin) if isempty(varargin)

% Use defaults.

m = mean2(f);

E = 4.0;

elseif length(varargin) == 2 m = varargin{1};

E = varargin{2};

else

error('Incorrect number of inputs for the stretch method.') end

g = 1./(1 + (m./f).^E);

cafe.daum.net/RobotVision 50

(51)

%---%

function g = spcfiedTransform(f, txfun)

% f is floating point with values in the range [0 1].

txfun = txfun(:); % Force it to be a column vector. if any(txfun) > 1 || any(txfun) <= 0

error('All elements of txfun must be in the range [0 1].') end

T = txfun;

X = linspace(0, 1, numel(T))';

g = interp1(X, T, f);

cafe.daum.net/RobotVision 51

(52)

%---%

function g = logTransform(f, varargin) [f, revertclass] = tofloat(f);

if numel(varargin) >= 2

if strcmp(varargin{2}, 'uint8') revertclass = @im2uint8;

elseif strcmp(varargin{2}, 'uint16') revertclass = @im2uint16;

else

error('Unsupported CLASS option for ''log'' method.') end

end

if numel(varargin) < 1

% Set default for C.

C = 1;

else

C = varargin{1};

end

g = C * (log(1 + f));

g = revertclass(g); cafe.daum.net/RobotVision 52

(53)

Tip: imadjust

J = imadjust(I,[low_in; high_in],[low_out; high_out],gamma)

• gamma < 1  the mapping is weighted toward higher (brighter) output values.

• gamma > 1  the mapping is weighted toward lower (darker) output values.

• gamma == 1  linear mapping

– If you omit the argument, gamma defaults to 1.

• If high_out < low_out, the output image is reversed, as in a photographic negative.

53 cafe.daum.net/RobotVision

(54)

Tip: mean2

• Compute the mean of the elements of a matrix

cafe.daum.net/RobotVision 54

(55)

• 그림 2.6(a)  콘트라스트-스트레칭  그림 2.6(b)

>> g = intrans(f, 'stretch', mean2(tofloat(f)), 0.9);

– Q1: Why apply tofloat? Ans)

– Q2: Why not use mean2(mat2gray(tofloat(f)))? Ans)

>> figure, imshow(g)

• 영상 f  tofloat  [0., 1.]로 스케일링 (E 값(0.9)은 대화식으로 결정되었음.)

예제 2.3 함수 intrans 사용 하기 예제 2.3 함수 intrans 사용 하기

55 cafe.daum.net/RobotVision

h1

(56)

슬라이드 55

h1 took 1 hour for the rest 11 pages (예제 3.3) --> around 5 min. per page

y, 2005-04-15

(57)

56 cafe.daum.net/RobotVision

(58)

Week 4 HW (1) Week 4 HW (1)

• intrans 이용

• 모든 method를 사용

• 각 method의 효과 확인(‘neg’ 외에는 개선 효과 보여줄 것)

• 각 method 별로 다른 영상 사용 허용(즉, 각 method에 적합한 영상을 사용해도 됨.)

cafe.daum.net/RobotVision 57

(59)

histograms

(a) imhist(f)

(b) imhist(im2double(f)) (c) intrans(f, ‘stretch’,

mean2(tofloat(f)), 0.9)

* mean2(…)  0.0672

(60)

• g = 255.* 1./(1 + (m./(f + eps)).^E);

where m = 0.0672

f = 0: (1/256) : 1 E = 0.9

>> g = 255.* 1./(1 + (0.0672./(f + eps)).^0.9);

stretchTransform

(61)
(62)

E = 0.9

(m = 0.6114)

(63)

>> x = 0:1/256:1;

>> figure, plot(x,1./(1+(m./(x + eps)).^E)); % m=.6114, E=.9

>> ylim([0 1])

S字?

62 cafe.daum.net/RobotVision

(64)

%%

f = tofloat(gray_im);

% f = im2double(f);

if ndims(f) > 2 f = rgb2gray(f) end

subplot(2,2,1); imshow(f) subplot(2,2,3); imhist(f) m = mean2(f);

E = 4.9;

g = 1./(1 + (m./(f + eps)).^E);

subplot(2,2,2); imshow(g) subplot(2,2,4); imhist(g)

M-file로 optimum E 값 찾기

Cell > Evaluate Current Cell

(65)

E = 4.9

64 cafe.daum.net/RobotVision

(66)

>> figure, plot(x,1./(1+(m./(x + eps)).^E));

65 cafe.daum.net/RobotVision

E = 4.9

(67)

g = 255.* 1./(1 + (m./(f + eps)).^E);

66 cafe.daum.net/RobotVision

(68)

An M-Function for Intensity Scaling

• g = gscale(f, method , low, high)

– 지정된 범위로 매핑(리스팅은 부록 C에) method:

① 'full8' (the default), which scales the output to the full range [0, 255],

② 'full16', which scales the output to the full range [0, 65535].

(If included, parameters low and high are ignored in these two conversions)

③ 'minmax', in which case parameters low and high, both in the range [0, 1], must be provided.

– 입력 class == 출력 class

cafe.daum.net/RobotVision 67

참조

관련 문서

 왼쪽 마우스를 클릭하면 출력하던 것이 멈췄을 때, WM_LBUTTONDOWN 메시지 처 리를 하는 곳으로 메시지 제어권을 보내주므로

price indices, calculated by the 2-stage frequency conversion procedure, offered lower MSE values and higher first-order auto-regression coefficient in all of 2-stage

Unregulated dc 입력 à regulated dc

The index is calculated with the latest 5-year auction data of 400 selected Classic, Modern, and Contemporary Chinese painting artists from major auction houses..

(g) Use MATLAB to plot the step response of the position servo system for values of the gain K = 0.5, 1, and Þnd the overshoot and rise time of the three step responses

→ f depends on the number of nucleation sites and the growth rate.. (c) All of the parent phase is consumed by the

F F Fi i ig g g.. 56℃ 이었으나 열싸이클링 수가 증가함에 따라 M s 및 M f 온도는 각각 2-3℃ 저하하는 것을 알 수 있었으며 heatfl ow 는 약간 감소하는 경향을 나타냈다.그러나 M

For camera 1, comparison of actual vision data and the estimated vision system model’s values in robot movement stage, based on the EKF method(unit: pixel) ···.. The estimated