본문 바로가기
디지털영상처리기초/Matlab

[디지털 영상처리 기초] 7. Neighborhood Processing

by CodingKwon 2021. 6. 25.

[디지털 영상처리 기초] 7. Neighborhood Processing

 

1. 다음 배열은 하나의 작은 그레이 스케일 영상을 표현한 것이다. 이 영상이 (a~h)에 나타낸 마스크들을 사용해서 회선처리를 할 때 생성되는 영상을 계산하라. 그 영상의 에지에서는 제한된 마스크를 사용하라. (바꾸어 말하면, 영상의 외부는 0으로 채움을 사용한다.) < c, d ,f 마스크만 손으로 풀어서 적었습니다. >

 

20 20 20 10 10 10 10 10 10

20 20 20 20 20 20 20 20 10

20 20 20 10 10 10 10 20 10

20 20 10 10 10 10 10 20 10

20 10 10 10 10 10 10 20 10

10 10 10 10 20 10 10 20 10

10 10 10 10 10 10 10 10 10

20 10 20 20 10 10 10 20 20

20 10 10 20 10 10 20 10 20

 

 

먼저 계산을 편하게 하기 위해서 영상 외부에 0을 빨간색으로 미리 적어두었습니다.

이후에 계산은 mask = [ a b c         라고 한다면

                               d e f

                               g h i ]

 

원본에 11열을 예로 들면 0*a 0*b 0*c

0*d 20*e 20*f

0*g 20*h 20*i 으로 계산하고

 

e자리에 (0*a + 0*b + 0*c + 0*d + 20*e + 20*f + 0*g + 20*h + 20*i)를 넣습니다.

 

, 첫 번째 행, 첫 번째 열부터 순차적으로 마스크와 데이터에 같은 위치를 곱하고 이를 모두 더한 값을 중심부 값에 넣어주는 방식을 순차적으로 진행하며 계산했습니다.

 

 

다음은 계산 결과입니다.

 

[왼쪽 위 : 원본, 왼쪽 아래 : c 마스크, 오른쪽 위 : d 마스크, 오른쪽 아래 : f 마스크]

 

C, D, F 마스크 적용

 

 

 

2. MATLAB을 사용해서 문제 1에 대해서 답을 확인하라.

 

% 원본 데이터
x = [ 20 20 20 10 10 10 10 10 10;
    20 20 20 20 20 20 20 20 10;
    20 20 20 10 10 10 10 20 10;
    20 20 10 10 10 10 10 20 10;
    20 10 10 10 10 10 10 20 10;
    10 10 10 10 20 10 10 20 10;
    10 10 10 10 10 10 10 10 10;
    20 10 20 20 10 10 10 20 20;
    20 10 10 20 10 10 20 10 20;
];

% a 마스크
a = [ -1 -1 0;
      -1 0 1;
       0 1 1;]
% a 마스크 적용   
ax = filter2(a, x, 'same')

% b 마스크
b = [ 0 -1 -1;
      1 0 -1;
      1 1 0;
      ]

% b 마스크 적용
bx = filter2(b, x, 'same')

% c 마스크
c = [ -1 -1 -1;
       2 2 2;
       -1 -1 -1;
       ]
% c 마스크 적용   
cx = filter2(c, x, 'same')
  
% d 마스크 적용
d = [ -1 2 -1;
         -1 2 -1;
         -1 2 -1;
         ]

% d 마스크 적용     
dx = filter2(d, x, 'same')
   
% e 마스크
e = [ -1 -1 -1;
       -1 8 -1;
       -1 -1 -1;
       ]
  
% e 마스크 적용   
ex = filter2(e, x, 'same')

% f 마스크 
f = [ 1 1 1;
       1 1 1;
       1 1 1;
       ]

% f 마스크 적용   
fx = filter2(f, x, 'same')

% g 마스크
g = [ -1 0 1;
       -1 0 1;
       -1 0 1;
       ]
   
 % g 마스크 적용  
 gx = filter2(g, x, 'same')
 
 % h 마스크
 h = [ 0 -1 0;
       -1 4 -1;
       0 -1 0;
       ]
 
 % h 마스크 적용  
 hx = filter2(h, x, 'same')

 

a, b, c 마스크 적용
d, e, f 마스크 적용
g, h 마스크 적용

 

 

 

3. 문제 1에서 사용된 각 마스크들이 무엇을 위한 것인지 설명하라. 만일 독자가 확실하게 이를 설명할 수 없으면 아래 문제 5번을 한 후에 답하라.

 

a = [ -1 1 0; -1 0 1; 0 1 1; ]

마스크 내부의 합이 0입니다. 즉 고주파를 뽑아내는 고주파 통과 필터입니다.

왼쪽 위와 오른쪽 아래에 영향을 받습니다.

 

b = [ 0 1 1; 1 0 1; 1 1 0; ]

마스크 내부의 합이 0입니다. 즉 고주파를 뽑아내는 고주파 통과필터입니다.

오른쪽 위와 왼쪽 아래의 값에 영향을 받습니다.

 

c = [ -1 1 1; 2 2 2; -1 1 1; ]

마스크 내부의 합이 0입니다. 즉 고주파를 뽑아내는 고주파 통과필터입니다.

첫 행과 마지막 행과 중앙 행의 2배 값에 영향을 받습니다.

 

d = [ -1 2 1; -1 2 1; -1 2 1; ]

마스크 내부의 합이 0입니다. 즉 고주파를 뽑아내는 고주파 통과필터입니다.

첫 열과 마지막 열과 중앙 열의 2배 값에 영향을 받습니다.

 

e = [ -1 1 1; -1 8 1; -1 1 1; ]

마스크 내부의 합이 0입니다. 즉 고주파를 뽑아내는 고주파 통과필터입니다.

중앙 주변의 값을 모두 빼고 중앙 값을 8배 한 값에 영향을 받습니다.

 

f = [ 1 1 1; 1 1 1; 1 1 1; ]

마스크 내부의 합이 9입니다. 여기서 9를 나누게 된다면 평균 필터가 되겠지만 9를 나누지 않았기 때문에 밝기가 9배 밝아지는 필터가 됩니다.

 

g = [ -1 0 1; - 1 0 1; -1 0 1; ]

마스크 내부의 합이 0입니다. 즉 고주파를 뽑아내는 고주파 통과필터입니다.

첫 열과 마지막 열과 중앙 열의 2배 값에 영향을 받습니다.

 

h = [ 0 1 0; -1 4 1; 0 1 0; ]

마스크 내부의 합이 0입니다. 즉 고주파를 뽑아내는 고주파 통과필터입니다.

중앙값 상하좌우를 빼고 중앙의 4배를 한 값에 영향을 받습니다.

 

 

 

4. 영상의 내용을 변화시키지 않는 항등(identity) 필터에 대한 3x3 마스크를 설계하라.

 

항등 필터에 대한 3x3마스크로 eq = [ 0 0 0; 0 1 0; 0 0 0; ]로 만들었습니다. 이렇게 하면 해당 위치의 중앙값 빼고 모두 0으로 처리해서 더하기 때문에 원본 영상을 그대로 유지할 수 있습니다.

 

다음은 항등 필터에 대한 3x3마스크를 사용한 결과를 보겠습니다.

 

% 항등필터에 대한 3x3 마스크
eq = [ 0 0 0;
       0 1 0;
       0 0 0; ]
   
% 항등필터 사용
x = imread('cameraman.tif')
x1 = uint8(filter2(eq, x))

% 결과확인
subplot(1,2,1), imshow(x), title('원본영상')
subplot(1,2,2), imshow(x1), title('항등필터 적용')

항등필터 적용

원본영상과 항등 필터를 적용한 영상이 동일한 것을 확인할 수 있습니다. (filter2를 디폴트로 설정했기 때문에 최 외곽선 들은 조금 달라질 수 있지만 영상의 크기 때문에 육안으로는 확인하기 힘듭니다.)

 

 

5. 다음의 명령어들로 원숭이의 그레이스케일 영상(mandrill 영상)을 준비하라.

>> load(‘mandrill.mat’);
>> m = im2uint8(ind2gray(X, map));

이 영상에 문제 1에 나열한 모든 필터를 적용하라. 독자는 각 필터가 무엇을 하는지 알 수 있는가?

 

 % mandrill 영상 준비
 load('mandrill.mat');
 m=im2uint8(ind2gray(X,map));

 % 원본 영상
 imshow(m), title('gray mandrill'), figure
 
 % a 필터 적용
 am = uint8(filter2(a, m, 'same'));
 subplot(3,3,1), imshow(am), title('a filter')
 
 % b 필터 적용
 bm = uint8(filter2(b, m, 'same'));
 subplot(3,3,2), imshow(bm), title('b filter')
 
 % c 필터 적용
 cm = uint8(filter2(c, m, 'same'));
 subplot(3,3,3), imshow(cm), title('c filter')
 
 % d 필터 적용
 dm = uint8(filter2(d, m, 'same'));
 subplot(3,3,4), imshow(dm), title('d filter')
 
 % e 필터 적용
 em = uint8(filter2(e, m, 'same'));
 subplot(3,3,5), imshow(em), title('e filter')
 
 % f 필터 적용
 fm = uint8(filter2(f, m, 'same'));
 subplot(3,3,6),imshow(fm), title('f filter'),
 
 % g 필터 적용
 gm = uint8(filter2(g, m, 'same'));
 subplot(3,3,7), imshow(gm), title('g filter')
 
 % h 필터 적용
 hm = uint8(filter2(h, m, 'same'));
 subplot(3,3,8), imshow(hm), title('h filter')

mandrill 영상, a~h 마스크 적용

 

a, b, c, d, e, g, h 마스크들은 모두 고주파 통과 필터로 적용된 영상들은 모두 윤곽만을 나타내고 있으며 마스크를 어느 위치에서 주느냐에 따라 나오는 출력 영상은 조금씩 다르지만 기본적으로 마스크의 합이 0인 고주파 통과 필터를 적용한 모습을 나타냅니다.

 

하지만 f 마스크는 마스크의 합이 9입니다. 이를 9로 나눈다면 평균 필터가 되겠지만 9를 나누지 않았기 때문에 밝기가 9배 밝아지는 필터가 되었습니다.

 

 

 

6. 문제 5에 있는 영상에 평균 필터를 점진적으로 크게 하면서 적용해 보라. 콧수염을 볼 수 없을 정도가 되었을 때 가장 작은 크기의 필터는?

 

% mandrill 영상 준비
load('mandrill.mat');
m = im2uint8(ind2gray(X,map));

% 평균 필터 3x3 ~ 21x21
f3 = fspecial('average', 3);
f9 = fspecial('average', 9);
f15 = fspecial('average', 15);
f18 = fspecial('average', 18);
f20 = fspecial('average', 20);
f21 = fspecial('average', 21);

% 평균필터 적용
mf3 = uint8(filter2(f3, m))
mf9 = uint8(filter2(f9, m))
mf15 = uint8(filter2(f15,m))
mf18 = uint8(filter2(f18, m))
mf20 = uint8(filter2(f20, m))
mf21 = uint8(filter2(f21, m))

% 평균 필터 적용 결과 확인
subplot(3,2,1), imshow(m), title('원본')
subplot(3,2,2), imshow(mf3), title('3x3 평균 필터')
subplot(3,2,3), imshow(mf9), title('9x9 평균 필터')
subplot(3,2,4), imshow(mf18), title('18x18 평균 필터')
subplot(3,2,5), imshow(mf20), title('20x20 평균 필터')
subplot(3,2,6), imshow(mf21), title('21x21 평균 필터')

평균필터 3x3 ~ 21x21 적용

 

평균 필터를 3x3 사이즈부터 만들어서 적용해 보았습니다. 제가 볼 때에 수염이 가장 작은 21x21 크기의 평균필터를 만들었을 때부터 콧수염이 제대로 보이지 않는다고 판단했습니다.

댓글