개발자 끄적끄적
영상의 기하학처리 본문
<데이터의 보간(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)