현실감각 0% :: '분류 전체보기' 카테고리의 글 목록 (6 Page)

컴퓨터 관련 2014. 8. 6. 16:08

[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 


10-1
20-2
10

-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

 










소스예제 퍼온거 2013. 10. 31. 19:19

웹페이지가 스마트폰에서 너무 작게 보일때!! 스마트폰용 html 웹페이지로 볼 수 있도록 사이즈 바꿔주는 스크립트!



회사일 중에 안드로이드 스마트폰 앱을 만들어서 직원에게 배포해야 할 일이 있었는데, 플레이스토어에서는 특정 기업에서만 사용하는 앱은 등록해주지 않는지 아무리 기다려도 앱 등록되었다는 얘기가 없이 무한 대기상태라서 답답한 마음에 그냥 서버에 올려놨다. 문제는 FTP 서버에다 그냥 올려놔서 다들 다운로드 받는데 어려움을 많이 격는다는 것... 그래서 웹페이지에다 간단하게 <A HREF="http:// 요놈 사용해서 링크 올려놓고 다운로드 받을 수 있게 해놨는데 단순하게 만들어놨더니만 스마트폰 웹브라우저에서는 정말 코딱지만하게 나오는 것이었다.(귀찮아서 디자인 그딴건 신경조차 안썼다..;;)





막 위 사진처럼 나와서 글씨 안보인다고 난리고..ㅠㅠㅠㅠㅠㅠㅠ(물론 확대하면 되긴 하지만... 그마저도 귀찮으신듯..ㅠㅠ) 그래서 스마트폰 웹브라우저에서도 잘 보이도록 만드려고 했는데 평소에 스마트폰 웹쪽엔 관심이 없는지라... 급하게 구글링!! 디자인까진 신경안쓰더라도 크게는 보이게 만들어놔야지...

http://davidbcalhoun.com/2010/using-mobile-specific-html-css-javascript

David Calhoun이라는 분의 블로그인거 같은데 스마트폰 웹을 만들고자 하는 초보자들에게 기초적이면서도 유용한 정보가 많이 있는 것 같다.


아무튼 화면 크기를 맞춰주는 스크립트는... 바로 


<meta name="viewport" content="width=device-width, initial-scale=1.0"/>

검색해도 잘 나오지도 않고... 엄청 헤맸는데, 알고보니 별.거.없.다.. 그냥 width를 디바이스위드로 맞춰주라는 위 스크립트를 그냥 html 페이지 상단에 쑤셔넣으면 된다. 그럼 아래와 같이 스마트폰 화면에 맞게 나오는 모습을 볼 수 있다.






소스예제 퍼온거 2013. 7. 3. 15:59

openCVSharp LoG와 DoG 산출



IplImage imgSrc = Cv.LoadImage(openFileDialog1.FileName);
IplImage imgGray = Cv.CreateImage(imgSrc.Size, BitDepth.U8, 1);
IplImage imgGaus1 = Cv.CreateImage(imgSrc.Size, BitDepth.U8, 1);
IplImage imgGaus2 = Cv.CreateImage(imgSrc.Size, BitDepth.U8, 1);
IplImage LoG = Cv.CreateImage(imgSrc.Size, BitDepth.F32, 1);
IplImage DoG = Cv.CreateImage(imgSrc.Size, BitDepth.U8, 1);
Cv.CvtColor(imgSrc, imgGray, ColorConversion.RgbToGray);

Cv.Smooth(imgGray, imgGaus1, SmoothType.Gaussian, trackBar1.Value, 0, 0, 0);
Cv.Smooth(imgGray, imgGaus2, SmoothType.Gaussian, trackBar2.Value, 0, 0, 0);

Cv.Laplace(imgGaus1, LoG, ApertureSize.Size7);
Cv.Sub(imgGray, imgGaus2, DoG);
Cv.MaxS(LoG, 0, LoG);

picturebox1.ImageIpl = imgSrc;
picturebox2.ImageIpl = LoG;
picturebox3.ImageIpl = DoG;