메뉴판 인식 - MenuBoard Recognition For foreign

Developed Program/Windows Mobile 2010. 10. 19. 18:10


인터페이스쪽에서의 특징이라면
먼저 Camera 와 Image, 양쪽 입력영상을 사용하는데 있겠다.
Windows Mobile의 카메라 여는 함수를 이용, 메뉴판을 캡쳐
(preprocessing이 좀 허술해서 제대로 하려면 실제 배경이 있는 메뉴판에서 텍스트 디텍션을 해야겠지만 
A4에 메뉴만 인쇄하여 이를 이용한다) 하여 이진화, 분할 , 인식, DB결과 출력을 거친다.

한글의 자모분리에서 떨어진 문자는 영상처리에서 흔히들 사용하는
Labeling(Connected Component) 알고리즘을 이용해서 쉽게 분리할 수 있지만

Labeling Algorithm



와 같이 연결성이 있는 화소들에 고유 숫자를 매기는 알고리즘.

필자는 GrassFire(잔디에서 불이 퍼져나가는 모양과 유사하다하여 붙여진 이름, 일종의 재귀 함수)를 이용했었다.

'거' 와 같이 자음과 모음이 접촉 되어 있는 경우 이를 분리할 알고리즘이 문제였다.
Fuzzy - 인공지능 -  같은 방법을 이용해 학습시켜 분리할 수도 있지만 뉴런 쪽을 전혀 배운 적이 없었기 때문에 다른 방법을 이용해야 했다.

여러 논문들을 찾아보고 난 뒤에 이용할 만한 정보를 얻을 수 있었는데,
한글의 유형을 분리한 뒤,특정 유형에 따라 나눈 것에서 부터 시작했다.

한글의 유형



만약 1 유형이라면 접촉모음은 반드시 수직모음이다.
2 유형에서 접촉모음이 있다면 그 모음은 반드시 수평모음이다.
그렇다면 자음과 모음이 만나는 점에서 쪼개버리면 된다.


유형을 나누는 부분도 꽤 골치가 아픈데, 유료 논문의 알고리즘인만큼 여기서 언급하기는 곤란하고, 궁금하다면 직접 돈주고 구매하기 바란다. ( 저 같은 경우는 학교에서 미리 다 결제를 해놨기 때문에 별도 요금없이 볼 수 있었습니다 )




위 이미지는 자모를 분리한 결과이다.


최종 산출물의 결과는
슬라이드 쇼를 확인하기 바란다.

                                    
012345678


Matlab을 이용한 영상처리 - 2. Matlab의 기본

Programming/Image Processing 2010. 8. 25. 00:43

2 학년때 Matlab기본 조작법을 선형대수학 시간에 알려줬었지만, 사실 실제로 실습을 한 것도 아니고 ..
제대로 사용해 보는 것도 이번이 처음이다.

때문에 내 의지와 상관없이 아주 기본부터 해보았다..
불행히도 나는 하이라이트 기능 사용법을 모르기 때문에 (ㅠ_ㅠ) 스크린샷을 일일히 찍었다.


첫 소스답게 짧다. 하지만 의외로 많은 것이 이루어져있다.
C 나 Java에서 이만한 작업을하려면 , 먼저 이미지를 불러오는데만 3~5라인, (CreateBitmap, DrawBitmap...) 픽셀을 받아오는데만 수십 라인... (Java , 안드로이드에서는 그래도 함수하나로 해결이 된다)그리고 조작에 for문 등의 삽질이 들어가는데 .. 아주 편하다.

짧지만 이미지 크기 조정도 해보고, grayscale로도 만들어보고, 밝기조절(?)도 해보고 이진화도 되었다. 평균 2라인.. 이래서 영상처리는 Matlab을 하라고 하는가 보다.

아무튼, Line by line으로 짚고 넘어가보자.
먼저 첫번째 라인 w = imread('img_0605.jpg'); Image read의 약어(Abbreviation) 이다.
현재 폴더(Matlab의 작업환경)에서 이미지를 읽어와 w 변수에 저장, resize를 통해 250 x 250의 크기로 조정하였다.

figure를 통해 새창을 띄우고, 그 새창에 image를 보여준다(show)  여기서 콤마(,)는 그저 한 작업이 끝났음을 표기한 것이다. (한 라인에 표기하기 위해. 콤마가 없을때는 에러가 발생한다. 콤마없이 쓰고싶다면 엔터키를 살포시 눌러주자)
이를 세미콜론(;)과 혼동할 가능성이 있는데, Matlab에서 세미콜론은 조금 특별한 의미가 있다.

; 표기시, 실행결과를 보여주지 않는다. 만약 1번째나 2번째 라인에서 ;이 표기 되지 않고 한줄이 끝났다면, w 의 사이즈 만큼의 Matrix가 Command Window에 출력된다. 이 Matrix의 수치값은 지금 당장 필요치 않기때문에 ;을 넣어주었다.

3번 라인까지의 실행결과는 다음과 같다. Figure 1 : 원본이미지


9번라인이 현재 주석처리가 되어있다. 머리에 붙어있는 %를 떼고 실행하면 Figure 2가 짜잔하고 나타난다. RGB 형태인 원본이미지 w를 함수(rgb2gray)를 사용, 간단하게 grayscale화 시켰다.


Figure 2 : GrayScale


11번 라인을 보자. w를 double형으로 변환시켜 d 변수에 저장했다.
Matrix d의 어떤 픽셀은 125.00 일 수도 있고, 255.00 일 수도 있다. 그런데 imshow 함수는 double형을 출력 할때 0~1의 범위내에서만 색상을 표현한다. 그럼 125.00인 픽셀과 255.00인 픽셀은 어떻게 될까?
1로 간주 된다. 1은  흰색으로 약속되어 있기 때문에 , 125도 255도 , 1도 흰색이 되어 원하는 이미지를 얻기는 어렵다.

그럼 double형의 이미지를 제대로 출력하려면 어떻게 해야 할까 ?
간단하다. d를 /255로 나눈 몫을 이용하면 된다. 12라인과 같이 매트릭스에 /x 를 연산하면 매트릭스의 모든 값이 /x연산을 수행한 결과가 되기 때문에 올바르게 분포된 0~1사이의 이미지를 얻을수 있다.

11번라인은 /255 대신에 128을 수행하였다.
128로 나누면 범위가 0~2임을 의미하고, 여기서 1~2는 흰색으로 디스플레이 되므로
그 결과는 원본 이미지보다 밝게 나타나게 된다.

Figure 3. 밝은 이미지
 

15번 라인을 보자. grayscale 이미지중 100보다 큰 값은 참 (1)이 된 Matrix를 b에 저장하였다.
나머지는 거짓(0)이 되므로 1과 0 두값만 가지게 되며, 따라서 이미지는 이진화가 된다.

Figure 5 . 이진화


Matlab에 대한 기본적인 문법설명 또한 첨부되다보니 분량이 많이 늘었다.
그래도 이미지가 들어가니 이제 좀 영상처리에 대한 포스팅 다워졌다.

다음 글은 비트평면과 공간분해능(모자이크)에 대해 알아본다.

Matlab을 이용한 영상처리 - 1. 영상처리란?

Programming/Image Processing 2010. 8. 24. 16:42

지인의 추천으로 영상처리를 연구하는 연구실에 소속된지 1년 반이 되었지만 영상처리에대해 심도있게 한 책을 부여잡고 공부한 적은 없는 것 같다.

졸업을 앞두고있지만(ㅠㅠ) 그 전에 연구실에 꽁박힌 영상처리 책 한권정도는 끝내고 가보려고 한다 !

어디서나 접속하고 쉽게 관리가 가능하다는 블로그의 장점을 십분활용해서 학습일지를 작성할 것이다.  돌아서면 잊어버리는 내 습성?을 감안해서 되도록 언제 다시 보더라도 이해 하기 쉽도록 글을 작성해 볼 것이다.

영상처리에 대해 공부하려면 먼저 영상처리가 무엇인지 알아야겠지 ?
영상처리를 한마디로 하자면

편의를 위해 영상을 조작하는 것이다.

너무 짧은가 ? 하지만 이 이상 영상처리를 잘 표현하는 말은 없을 것 같다.(있으면..말고;;)
흔히들 사용하는 포토샵이 그 일례라 할 수 있다.
인간은 대부분 보다 디테일한 영상을 원하지만, 반대로 기계는 여러 자동화 작업을 위해 단순하게 영상처리를 하는 것을 선호하는 편이다.


영상과 디지털 영상

영상처리를 위해서 연속적인 이미지를 샘플링하는 것이 필요하다.
여기서 샘플링이란, 이산(discrete)값으로 변화시키는 것이다.
간단한 예를 들자면 RGB색상 표현법에서 (255,0,0)과 같이 색상이 표현되지 않는가?
사실 붉은색과 좀더 연한 붉은색은 연속적이지만 수치화를 통해 이산화를 시킨것이다.
(255와 240과 같이)

이렇게 해도 연속적인 이미지를 복원할수 있음이 보장된 것은, 하나의 직선이 있을때 두개의 점만으로도 그 직선을 그릴수 있다는 것을 생각하면 간단하다.
물론 곡선에서도 그 곡선이 그려질수 있도록 충분한 정보를 제공하는 점이 있다면 이것이 가능하다고 볼 수있다. 이 '충분한 정보'의 Threshold가 되는 샘플링 주기를 나이퀴스트 한계조건 이라 일컫는다. 

샘플링후에 조작, 대표적인 영상의 형태는 4가지가 있다.

1. 이진 영상 - 이미지에서 관심있는 픽셀과 관심없는 픽셀을 나누는 작업이 이뤄진 영상. 대체로 1과 0으로 나눔
2. 그레이 스케일 - 다른 영상처리의 처리속도 향상을 위해 수행되는 작업. 흑백영상.
3. RGB
4. 인덱스화 - 저장과 같은 파일의 포멧에 맞추기위해 칼라맵 혹은 칼라 팔레트로 대응시킨 영상
(즉 실제 칼라를 사용하지 않고 맵에 있는 칼라로 인덱스-찾아가기.. 배열의 참조주소등을 지정했다고 이해하면 쉬울듯-화 시킴)

Intro가 조금 길어졌다.
다음 글은 Matlab 함수를 본격적으로 이용해보겠다.