[MATLAB] 에지방향(Edge Orientation)
[MATLAB] 에지방향(Edge Orientation)
간만에 논문을 한편 쓸일이 생겨서 이것저것 해보던 도중 에지 방향을 검출해서 인식에 사용하게 되었다.
예전에 암것도 모르던 시절에는 무식하게 캐니 에지 돌린담에 마스크 씌워가지고 일일이 에지의 방향을 검출했을 텐데...
아는게 좀 늘었다고 다른 방법을 써봤다.(물론 내가 찾아낸건 전혀아니다. 아니라 원래 이렇게들 쓰고있고 나혼자 몰랐음ㅋ)
영상처리를 공부하면 가장 처음에 배우다시피하는 에지 검출
여기서 주로 나오는 에지검출 연산자는 소벨(Sobel), 프리윗(Prewitt) 연산자 등이 있다.(또는 유사한 2차미분연산자)
이놈들의 특징은 바로 마스크의 형태에 따라 0도 또는 90도 방향성 에지를 검출한다는 것인데...
이걸 이용해서 방향성 에지를 검출하면 그게 바로 에지의 방향!!ㅋ
가장 무난한 소벨 에지를 가지고 테스트하였다.
우선 각도에 따른 마스크를 생성
0º
1 | 2 | 1 |
0 | 0 | 0 |
-1 | -2 | -1 |
-1 | -2 | -1 |
0 | 0 | 0 |
1 | 2 | 1 |
90º
-1 | 0 | 1 |
-2 | 0 | 2 |
-1 | 0 | 1 |
1 | 0 | -1 |
2 | 0 | -2 |
1 | 0 | -1 |
45º
2 | 1 | 0 |
1 | 0 | 1 |
0 | -1 | -2 |
-2 | -1 | 0 |
-1 | 0 | 1 |
0 | 1 | 2 |
135º
0 | -1 | -2 |
1 | 0 | 1- |
2 | 1 | 0 |
0 | 1 | 2 |
-1 | 0 | 1 |
-2 | -1 | 0 |
그담에 이것들로 컨벌루션해서 에지를 생성한다
a = convol(bw, mask_0_0);
b = convol(bw, mask_0_1);
c = a + b;
그담에 0도 영상에서 90도 영상을 빼면 0도방향의 에지
90도에서 0도 영상을 빼면 90도 방향 에지
마찬가지로 45도영상에서 135도 영상을 빼면 45도 에지
135도 영상에서 45도를 빼면 135도 에지 영상이 나온다.
그럼 아래 영상과 같은 결과가 나옴
원본 영상
0도 에지
90도 에지
45도 에지
135도 에지
각 에지맵을 RGB 영상에 각각 R, G, B값으로 넣으면 다음과 같이 방향에 따른 에지의 색깔도 표현할 수 있다.
(135도는 R+G값으로 표현)
매트랩 소스도 별거없다.
먼저 컨벌루션 함수
function [ xxx ] = convol( img, mask )
[j i z] = size(img);
g = int16(img);
xxx(1:j, 1:i) = 0;
for y = 2:j - 1
for x = 2:i - 1
xxx(y,x) = ((g(y-1,x-1) * mask(1, 1)) + (g(y-1,x) * mask(1, 2)) + (g(y-1,x+1) * mask(1, 3)) + (g(y,x-1) * mask(2, 1)) + (g(y,x) * mask(2, 2)) + (g(y,x+1) * mask(2, 3)) + (g(y+1,x-1) * mask(3, 1)) + (g(y+1,x) * mask(3, 2)) + (g(y+1,x+1) * mask(3, 3)));
end
end
xxx = uint8(xxx);
end
function [ output_args ] = edgeori(img)
mask_0_0 = [1 2 1;0 0 0;-1 -2 -1];
mask_0_1 = [-1 -2 -1;0 0 0;1 2 1];
mask_90_0 = [-1 0 1;-2 0 2;-1 0 1];
mask_90_1 = [1 0 -1;2 0 -2;1 0 -1];
mask_45_0 = [2 1 0;1 0 -1;0 -1 -2];
mask_45_1 = [-2 -1 0;-1 0 1;0 1 2];
mask_135_0 = [0 1 2;-1 0 1;-2 -1 0];
mask_135_1 = [0 -1 -2;1 0 -1;2 1 0];
g = rgb2gray(img);
bw = histeq(g);
a = convol(bw, mask_0_0);
b = convol(bw, mask_0_1);
c = a + b;
a = convol(bw, mask_90_0);
b = convol(bw, mask_90_1);
d = a + b;
a = convol(bw, mask_45_0);
b = convol(bw, mask_45_1);
e = a + b;
a = convol(bw, mask_135_0);
b = convol(bw, mask_135_1);
f = a + b;
w = c - d;
x = d - c;
y = e - f;
z = f - e;
figure, imshow(w);
figure, imshow(x);
figure, imshow(y);
figure, imshow(z);
end