개발자 끄적끄적

영상의 기하학처리 본문

영상처리

영상의 기하학처리

햏치 2023. 4. 10. 00:08

<데이터의 보간(interpolation)>
- 최근접 보간법
  - 순방향(x1~x4)->(x1'~x8') : 원영상 4개의 pixel로부터 확대된 8개의 pixel의 좌표값을 구하는 것
  - 역방향(x1'~x8')->(x1~x4) : 확대된 8개의 pixel 좌표에 원영상 4개의 pixel로부터 data를 가지고 와서 8개의 pixel의 data를 생성하는 과정

- Matlab은 imresize 함수를 가지고 있는데, 아래와 같이 처리할 수 있다
  - resize(A,k,'method') 
    - A = 영상의 형식, k=척도계수, 'method'=최근법 또는 양선형 중 하나
  
  - resize(A, [m,n], 'method')
    - [m,n]은 출력의 척도 사이즈

- ex) Matlab으로 구현
>>c=imread('cameraman.tif'); //카메라맨 영상('camaraman.tif')을 읽고
>>head=c(33:96, 90:153); //세로축(33x96)만큼, 가로축(90,153)만큼 떼어낸다
>>imshow(head) //카메라맨 영상의 머리 부분
>>head4n=imresize(head,4,'nearest'); imshow(haed4n) //최근점법(nearest), 가로축, 세로축4배 확대:16배 확대
>>head4b=imresize(head,4,'bilinear'); imshow(haed4b)//양선형 보간법(bilinear)

- 선형 보간법
  - F = 람다*f(x2) + (1-람다)*f(x1)
  - F의 pixel값은 거리에 반비례하게 영향을 받는다
  - F의 pixel 값을 f(x2)로부터 람다만큼 영향을 받고 f(x1)으로부터 (1-람다)만큼 영향을 받는다
*pixel과 pixel사이의 거리는 1


<3차 곡선 보간법(cubic interpolation)>
R(u) =
if |u|<=1,     1.5|u|^3 - 2.5|u|^2 +1
if 1<|u|,=2,  -0.5|u|^3 + 2.5|u|^2 -4|u| +2
 
ex)Matlab으로 이 보간을 처리하기 위해 imresize함수의 'bicubic'방법을 이요한다
  카메라멘 영상의 머리 부분을 확장하기 위하여 아래의 명령을 사용한다
>>head4c=imresize(head, 4, 'bicubic'); imshow(head4c)


<공간필터링에 의한 확대>
- 2의 배수로 영상을 확대할 경우 빠르고 대략적인 보간은 선형필터링을 이용한다
  그 첫 단계로 이 매트릭스의 행과 열의 데이터 사이에 0을 채워 넣는다
  그러면 매트릭스의 사이즈는 가로 및 세로방향으로 2배가 되어 전체는 원래의 매트릭 4배가된다
  m2(새로운 매트릭)가 m에 0을 채운 매트릭스라고 하면 아래 식과 같다
  즉, 최근접 보간법으로 확대
 
  m2(i,j) = 
  if i and j are both odd(홀수), m2(i,j) = m((i+1)/2, (j+1)/2)
  otherwise, m2(i,j) = 0


ex)
>>m=magic(4) //가로합, 세로합, 대각선의 합이 똑같은 4x4행렬을 만든다
>>m=
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

>>k=[m;zeros(4,4)] //4x4의 0행렬을 아래에 넣는다
>>k=
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0

>>a2=reshape(k,4,8) //k에 대하여 재배열을 하고, 4x8로 정렬
>>a2=
    16     0     2     0     3     0    13     0
     5     0    11     0    10     0     8     0
     9     0     7     0     6     0    12     0
     4     0    14     0    15     0     1     0

>>kk=[a2';zeros(8,4)] //a2에 8x4의 0행렬을 넣는다
>>kk=
    16     5     9     4
     0     0     0     0
     2    11     7    14
     0     0     0     0
     3    10     6    15
     0     0     0     0
    13     8    12     1
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0

>>reshape(kk,8,8) //kk에 대하여 8x8 재배열
ans=
 16     0     5     0     9     0     4     0
     0     0     0     0     0     0     0     0
     2     0    11     0     7     0    14     0
     0     0     0     0     0     0     0     0
     3     0    10     0     6     0    15     0
     0     0     0     0     0     0     0     0
    13     0     8     0    12     0     1     0
     0     0     0     0     0     0     0     0


<스케일링에 의한 축소>
- 영상을 축소한다는 것은 영상의 최소화라고 한다
  영상을 축소하는 한 가지 방법은 짝수 번째 화소 혹은 홀수 번째 화소를 지워서 없애는 것이다
  원 영상을 1/16로 만들려면 각각 i와 j 방향으로 4번째 화소 값만 뽑아낸다
  이 방법을 '서브샘플링(subsampling)' 이라고 한다
  이는 imresize의 최근접에 대응하고 구현하기 쉽다
  그러나 이 방법은 고주파성분의 특성이 좋지 않다
*고주파 성분 : pixel 데이터 변화가 굉장히 크다
- ex)
>>tr=imresize(t, 0.25);
>>trc=imresize(t, 0.25, 'bicubic');



<회전 처리>
- 스케일링(척도변환)에 대한 보간처리에서 영상의 회전에 대하여 동일한 이론을 적용할 수 있다

- 순방향 Mapping
x', y'는
[cos -sin][x]
[sin  con][y]

- 역방향 Mapping
x, y는
[cos   sin][x']
[-sin  cos][y']

- Matlab에서 영상회전은 imrotate; 라는 명령을 이용하여 얻을 수 있는데, 그 구문은 아래와 같다
  imrotate(image, angle, 'method') 
  여기서, imresize에서와 같이 최근접법, 양선현법 혹은 3차원곡선 버간법을 사용할 수 있다
  imresize와 같이 파라메터가 생략되면 최근법 보간법을 적용하게 된다
  예를 들면 카메라맨 영상을 60도 회전하자 
  이 때, 한 번은 최근접법을 또 한 번은 3차원 곡선보갑법을 처리한다
>>cr=imrotate(c, 60);
>>imshwo(cr)
>>crc=imrotate(c, 60, 'bicubic');
>>imshow(crc)

'영상처리' 카테고리의 다른 글

영상 복원  (0) 2023.04.28
영상의 영역처리  (0) 2023.04.01
영상의 점처리  (0) 2023.03.24