OCR 프로그래밍: 이미지 인식

Similar documents
URL Shortener 프로젝트로 배우는 Vert.X 프레임워크

C++ Programming

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

SIGIL 완벽입문

Microsoft PowerPoint - chap01-C언어개요.pptx

안전한 웨 애플리케이션을 위한 자바스크립트 보안

PowerPoint 프레젠테이션

C++ Programming

Microsoft PowerPoint - chap06-2pointer.ppt

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - C++ 5 .pptx

C# Programming Guide - Types

Microsoft PowerPoint - chap04-연산자.pptx

본책- 부속물

5장. JSP와 Servlet 프로그래밍을 위한 기본 문법(완성-0421).hwp

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

PowerPoint Presentation

C O N T E N T S 목 차 요약 / 1 I. 중남미화장품시장현황 / 3 Ⅱ. 주요국별시장정보 / 9 ( 트렌드 유통망 인증 ) 1. 브라질 / 9 2. 멕시코 / 콜롬비아 / 칠레 / 64 Ⅲ. 우리기업진출전략 / 79 # 첨부. 화장품관

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

PowerPoint Presentation

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

Ver 1.0 마감하루전 Category Partitioning Testing Tool Project Team T1 Date Team Information 김강욱 김진욱 김동권

Microsoft PowerPoint - chap06-1Array.ppt

BMP 파일 처리

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

PowerPoint Presentation

JUNIT 실습및발표

OCW_C언어 기초

MFC 프로그래밍: 주식 분석 프로그램 만들기

슬라이드 1

Microsoft PowerPoint - additional01.ppt [호환 모드]

PowerPoint Template

설계란 무엇인가?

슬라이드 1

중간고사

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

17장 클래스와 메소드

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

PowerPoint 프레젠테이션

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

Microsoft Word - PLC제어응용-2차시.doc

슬라이드 1


adfasdfasfdasfasfadf

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

Microsoft PowerPoint - Java7.pptx

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

PowerPoint 프레젠테이션

슬라이드 1

금오공대 컴퓨터공학전공 강의자료

Studuino소프트웨어 설치

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - ch07 - 포인터 pm0415

UI TASK & KEY EVENT

KNK_C_05_Pointers_Arrays_structures_summary_v02


C 프로그램의 기본

쉽게 풀어쓴 C 프로그래밍

2015 개정교육과정에따른정보과평가기준개발연구 연구책임자 공동연구자 연구협력관

µ¶µµºÎ·Ï1~64

윤성우의 열혈 TCP/IP 소켓 프로그래밍

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

1.2 자료형 (data type) 프로그램에서다루는값의형태로변수나함수를정의할때주로사용하며, 컴퓨터는선언된 자료형만큼의메모리를확보하여프로그래머에게제공한다 정수 (integer) 1) int(4 bytes) 연산범위 : (-2 31 ) ~ (2 31 /2)-

C O N T E N T 목 차 요약 / 4 Ⅰ. 서론 Ⅱ. 주요국별대형유통망현황 / Ⅲ. 시사점및진출방안 ( 첨부 ) 국가별주요수입업체

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

JAVA PROGRAMMING 실습 08.다형성

chap 5: Trees

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

OCW_C언어 기초

Microsoft PowerPoint 웹 연동 기술.pptx

로거 자료실

S - O I L M A G A Z I N E 2016 February Vol

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

Windows 8에서 BioStar 1 설치하기

(Microsoft PowerPoint - 11\300\345.ppt [\310\243\310\257 \270\360\265\345])

원형연결리스트에대한설명중틀린것은 모든노드들이연결되어있다 마지막에삽입하기가간단한다 헤더노드를가질수있다 최종노드포인터가 NULL이다 리스트의 번째요소를가장빠르게찾을수있는구현방법은무엇인가 배열 단순연결리스트 원형연결리스트 이중연결리스트 단순연결리스트의노드포인터 가마지막노드를

설계란 무엇인가?

Microsoft PowerPoint - chap03-변수와데이터형.pptx

윈도우즈프로그래밍(1)

Microsoft PowerPoint - chap06-5 [호환 모드]

1

Microsoft Word - Armjtag_문서1.doc

Windows 10 General Announcement v1.0-KO

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>


Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

Lab 3. 실습문제 (Single linked list)_해답.hwp

커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

쉽게 풀어쓴 C 프로그래밍

Install stm32cubemx and st-link utility

<B3EDB4DC28B1E8BCAEC7F6292E687770>

Microsoft Word - Crackme 15 from Simples 문제 풀이_by JohnGang.docx

Transcription:

112 OCR 프로그래밍 이미지 인식 김세훈 지음

112 OCR 프로그래밍 이미지인식 김세훈지음

표지사진김세훈이책의표지는저자김세훈님이보내주신풍경사진을담았습니다. 리얼타임은독자의시선을담은풍경사진을책표지로보여주고자합니다. 사진보내기 ebookwriter@hanbit.co.kr OCR 프로그래밍이미지인식 초판발행 2015 년 8 월 21 일 지은이김세훈 / 펴낸이김태헌펴낸곳한빛미디어 ( 주 ) / 주소서울시마포구양화로 7길 83 한빛미디어 ( 주 ) IT출판부전화 02-325-5544 / 팩스 02-336-7124 등록 1999년 6월 24일제10-1779호 ISBN 978-89-6848-773-6 15000 / 정가 13,000원 총괄배용석 / 책임편집김창수 / 기획 편집정지연 / 교정이미연디자인표지 / 내지여동일, 조판최송실마케팅박상용 / 영업김형진, 김진불, 조유미 이책에대한의견이나오탈자및잘못된내용에대한수정정보는한빛미디어 ( 주 ) 의홈페이지나아래이메일로알려주십시오. 한빛미디어홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr Published by HANBIT Media, Inc. Printed in Korea Copyright c 2015 김세훈 & HANBIT Media, Inc. 이책의저작권은김세훈과한빛미디어 ( 주 ) 에있습니다. 저작권법에의해보호를받는저작물이므로무단복제및무단전재를금합니다. 지금하지않으면할수없는일이있습니다. 책으로펴내고싶은아이디어나원고를메일 (ebookwriter@hanbit.co.kr) 로보내주세요. 한빛미디어 ( 주 ) 는여러분의소중한경험과지식을기다리고있습니다.

저자소개 지은이 _ 김세훈 내가지금뭐하고있지? 2010년 40살이되어불현듯나를돌아봤다. 열심히살려고부단히노력했던것같은데, 회사와집만을오가며답답한삶을살고있음을느꼈다. 그래서다짐했다. 이제부터즐기면서살자. 그런데삶은녹록하지가않았다. 되는일보다안되는일이더많다. 그것이인생이다. 라고하시는아버지의말씀도진리처럼느껴졌다. 몇년이흐른후내가변해있음을느꼈다. 무엇이나를변화하게했을까? 그건지금까지 5년넘게매일같이인생에대한글을쓴일이었다. 청소년기에가치관이정립된다고학교에서는가르치지만, 나는죽을때까지가치관을정립하며죽을때도깨우치지못한진리들이많을것이다. 좋은말씀을써오라는숙제를받은초등학생조카에게필자는말했다. 일기쓰면인생이변한다. 하루의일과가아닌, 인생의진지한글들을써보세요. 시간이한참흐른후자신이변해있음을발견하게됩니다. 필자는현재 지식소프트 1인회사에서부장으로재직중이다.

저자서문 언어를배울때사전을찾아본적이있을것이다. 사전에서원하는단어를찾는방법은간단하다. 정렬된순서에의해서찾고자하는단어가일치하면찾은것이다. 인식프로그램의가장대표적인것이전자사전인데, 전자사전에서단어를찾는것도일반사전에서단어를찾는것과마찬가지다. 데이터베이스가구축되어있고, 찾고자하는단어를찾으면된다. 모든인식프로그램이이원리를따르고있다. 그렇다면이미지나소리의인식은무엇이다를까? 프로그램에서새로운데이터타입을만들고사전처럼기존에만들어진데이터와비교할때정확한일치가어려우므로확률을사용한다는점이다. 즉, 일치하는확률이높은것을결과값으로결정하며, 얼마나정확한결과값을도출하느냐가인식률의높고낮음을나타낸다. 문자인식에대한기술은오래전에나왔으며, 이제는소리인식으로넘어갔다. 그러나기술공개는이루어지지않고있다. 이책에서설명하는내용은필자가생각해낸방법이므로이방법만이정답은아니다. 하지만개인적으로이방법이문자인식 OCR 을하는최적의방법이라생각한다. 데이터타입이무엇인지는 How-to Series 1편인 소수와 RSA 알고리즘으로배우는 Big Number 연산 - 구조체와자료구조의이해 ( 한빛미디어, 2013) 에서설명하였으며, 프로그래밍의시작은이데이터타입을이해하는것이라고본다. 이책에서도문자이미지를담기위한데이터타입을가장먼저다룰것이다. 여기서다루는새로운데이터타입을이해하면왜한글인식이영문인식보다어려운지를알게될것이다. 그다음으로는문자이미지를어떻게데이터타입에넣는지를다룬다. 이는문자

인식에서가장어려운부분이다. 하나의문자이미지가문자데이터타입에담기면기존에만들어놓은기본데이터타입과비교하면된다. 전체이미지에서하나의문자이미지만을가져오는방법은이미지마다다르게적용될수있기에이미지를분석하는기술을요구한다. 이미지인식의마지막은이미지변형 Image Transform 이다. 이미지변형은포토샵같은프로그램에서주로사용하는데, 간단한이미지변형으로인식률을어떻게높이는지알게될것이다. 이미지변형에서는수학적인내용이포함되나중학교수준의삼각함수를이해하고있는독자라면쉽게이해할수있다. How-to Series 는프로그램언어를설명하는책이아니며, 프로그램을어떻게만드는지를독자와함께공부하려는목적으로만들었다. 이책을가장효과적으로보려면전체를한번빨리훑고직접프로그램을만들면서막히는부분은이책을보면서풀어나가는것이좋다. How-to Series 는 1년에한가지주제로펴내고있다. 책마다개별주제로만들어지지만먼저출간된책에서설명한내용을이후의책에서는생략하는경우가있다. 시리즈 3편인이책에서구현하는프로그램은 MFC를사용하는데, MFC는 MFC 프로그래밍 : 주식분석프로그램만들기 ( 한빛미디어, 2014) 에서상세히설명하였기때문에이책에서는자세한설명을생략하였다. 예를들어, 도구상자 를사용하여버튼을만든다거나클래스를추가하는방법등이생략되었다. MFC 에대해충분히이해하고있지않다면 MFC 프로그래밍 : 주식분석프로그램만들기 를참조하면서보기를권한다.

세번째책인 OCR 프로그래밍 : 이미지인식 은힘들때항상함께해준나의친구 박흥준 에게바친다. 또한, 나의사랑하는조카 신효인 에게선물로준다. 나의영원한모델인효인이의개인사진사로활동하면서조금더사진에대해관심을갖게되었고, 이미지인식에쉽게접근할수있었다고생각한다.

대상독자및참고사항 초급초중급중급중고급고급 이책은 C++ 를알고있는초 중급자를대상으로하며 Windows 환경에서 MFC로 OCR 프로그램을만드는방법을설명합니다. 주제를가지고프로그램을배우자는목적으로 OCR이라는주제로처음부터단계적으로프로그램을만들어갑니다. 사진에서문자를인식하는 OCR 기술은다양한프로그램으로응용될수있는기술이며교육의목적으로 Windows 환경에서구현되었지만, 동일한원리로스마트폰애플리케이션에서응용할수있습니다. 이책에수록된코드들은 Windows에서생성하여실행해야하며, Visual Studio 2008에서구현되었습니다. 예제테스트환경사용프로그렘 설명 Visual Studio 2008 이상 예제는 Windows 환경에서테스트하였다. Windows OS Windows 환경에서만실행할수있다. 예제파일은다음에서다운로드할수있습니다. https://www.hanbit.co.kr/exam/2773 How-to Series 는방법론적인부분들에초점을맞추어만들어진책입니다. 일방적인지식의전달이라기보다는 이러한방법도있구나 하고이해하는것이중요합니다.

한빛리얼타임 한빛리얼타임은 IT 개발자를위한 ebook 입니다. 요즘 IT 업계에는하루가멀다하고수많은기술이나타나고사라져갑니다. 인 터넷을아무리뒤져도조금이나마정리된정보를찾기도쉽지않습니다. 또한, 잘정리되어책으로나오기까지는오랜시간이걸립니다. 어떻게하면조금이라 도더유용한정보를빠르게얻을수있을까요? 어떻게하면남보다조금더빨 리경험하고습득한지식을공유하고발전시켜나갈수있을까요? 세상에는수 많은종이책이있습니다. 그리고그종이책을그대로옮긴전자책도많습니다. 전자책에는전자책에적합한콘텐츠와전자책의특성을살린형식이있다고생 각합니다. 한빛이지금생각하고추구하는, 개발자를위한리얼타임전자책은이렇습니다. 1 ebook First - 빠르게변화하는 IT 기술에대해핵심적인정보를신속하게제공합니다 500페이지가까운분량의잘정리된도서 ( 종이책 ) 가아니라, 핵심적인내용을빠르게전달하기위해조금은거칠지만 100페이지내외의전자책전용으로개발한서비스입니다. 독자에게는새로운정보를빨리얻을기회가되고, 자신이먼저경험한지식과정보를책으로펴내고싶지만너무바빠서엄두를못내는선배, 전문가, 고수분에게는좀더쉽게집필할수있는기회가될수있으리라생각합니다. 또한, 새로운정보와지식을빠르게전달하기위해 O'Reilly의전자책번역서비스도하고있습니다. 2 무료로업데이트되는전자책전용서비스입니다 종이책으로는기술의변화속도를따라잡기가쉽지않습니다. 책이일정분량이상으 로집필되고정리되어나오는동안기술은이미변해있습니다. 전자책으로출간된이 후에도버전업을통해중요한기술적변화가있거나저자 ( 역자 ) 와독자가소통하면서보완하여발전된노하우가정리되면구매하신분께무료로업데이트해드립니다.

3 4 독자의편의를위해 DRM-Free 로제공합니다 구매한전자책을다양한 IT 기기에서자유롭게활용할수있도록 DRM-Free PDF 포맷으로제공합니다. 이는독자여러분과한빛이생각하고추구하는전자책을만들어나가기위해독자여러분이언제어디서어떤기기를사용하더라도편리하게전자책을볼수있도록하기위함입니다. 전자책환경을고려한최적의형태와디자인에담고자노력했습니다종이책을그대로옮겨놓아가독성이떨어지고읽기어려운전자책이아니라, 전자책의환경에가능한한최적화하여쾌적한경험을드리고자합니다. 링크등의기능을적극적으로이용할수있음은물론이고글자크기나행간, 여백등을전자책에가장최적화된형태로새롭게디자인하였습니다. 앞으로도독자여러분의충고에귀기울이며지속해서발전시켜나가도록하겠 습니다. 지금보시는전자책에소유권한을표시한문구가없거나타인의소유권한을표시한문구가있다면위법하게사용하고있을가능성이큽니다. 이경우저작권법에따라불이익을받으실수있습니다. 다양한기기에사용할수있습니다. 또한, 한빛미디어사이트에서구매하신후에는횟수에관계없이내려받으실수있습니다. 한빛미디어전자책은인쇄, 검색, 복사하여붙이기가가능합니다. 전자책은오탈자교정이나내용의수정 보완이이뤄지면업데이트관련공지를이메일로알려드리며, 구매하신전자책의수정본은무료로내려받으실수있습니다. 이런특별한권한은한빛미디어사이트에서구매하신독자에게만제공되며, 다른사람에게양도나이전은허락되지않습니다.

차례 chapter 1 OCR 이란무엇인가? 013 1.1 사진에서문자이미지가져오기 014 1.2 연산이가능한데이터만들기 016 1.3 확률을이용한인식 019 1.4 영문이한글보다인식률이높은이유 021 chapter 2 기본이미지데이터만들기 023 2.1 새로운데이터구조체 027 2.2 기본이미지데이터 029 2.3 문자이미지추출하기 035 2.4 이미지데이터만들기 067 2.5 기본이미지데이터불러오기 074 chapter 3 문서이미지 OCR 089 3.1 확률을이용한 OCR 093 3.2 줄바꿈문자추가하기 101 3.3 공백문자삽입하기 105 3.4 특수문자추가하기 116 3.5 마침표, 쉼표, 따옴표인식 121 3.6 대문자와소문자보정 130 3.7 문자색의범위조정으로인식률높이기 139

chapter 4 자동차번호판인식 143 4.1 사진크기변경및흑백사진만들기 144 4.2 문자이미지추출 151 4.3 문자이미지데이터변환 163 4.4 번호판인식 168 4.5 이미지데이터변형 175 부록 187 A.1 사진크기변경하기 187 A.2 사진회전하기 190 A.3 흑백사진만들기 192 A.4 서명넣기 195 글을마치며 201

chapter 1 OCR 이란무엇인가? 인식은인공지능 AI 의한분야라고볼수있다. 그시작은사전과같은간단한것이나궁극적으로추구하는것은사람간의의사소통일것이다. 지리적인문제와다양한언어는인간의의사소통을단절시켰지만, 인공지능은기계를통한연결로다른지역이나다른나라사람과의의사소통을원활히하기위해발전해왔다. 그런면에서음성인식은많이발전한듯보이지만아직시작단계다. 그렇다면이미지인식은어떨까? 이책에서다루려는이미지인식은문자에국한되고일반적인사물을인식하는것은현재로써는어렵다. 하지만 2차원적이미지인식도음성인식과별반다르지않다. 그런데도음성인식보다이미지인식이먼저발전한이유는무엇때문일까? 일정한틀안에이미지를담기가더쉬웠기때문이다. 문자를나누기가조금더쉬웠고프로그램언어로표현하는방법이용이했다. 1999년에처음으로문자인식펜을본적이있다. 종이에인쇄된알파벳을따라그으면단어의뜻이펜표면에뜨고, 스캔한글이인식되어워드파일로만들어졌다. 이후문자인식 OCR, Optical Character Recognition 은더발전하고많이보편화되었다. 예를들어, 주차장에서카메라로자동차번호판을읽는것도문자인식이다. 이책의마지막에자동차번호판인식을다루지만, 일반카메라로찍은사진이기에실제환경과는다른방법으로인식할것이다. 시중의자동차번호판인식은일반카메라가아닌특수카메라로찍기때문에문자부분과바탕부분이명확히흑백으로구분되어인식하기가훨씬용이할수있다. 1 OCR 이란무엇인가? - 013

이책을통해 OCR 을이해하고응용한다면일정한형태의문자를인식하는방법 을쉽게찾을수있을것이다. 1.1 사진에서문자이미지가져오기 사진에서문자를인식하기위해가장먼저해야할일은문자이미지부분을알아내는것이다. 이책에서는이를파싱한다고부를것이다. 이제부터이미지파싱이라고하면이미지에서문자부분을떼어낸다고이해하면된다. 문자이미지는사각형으로따낼것이며 2차원 ( 평면 ) 의사진에서는색으로만구분하기때문에정해진문자색을기준으로문자이미지를인식할것이다. 또한, 문자색으로지정된특정색이외의것은모두바탕으로생각하고무시하면된다. 즉, 문자색이검은색이라면사진에서검은색이외의부분은모두흰색이고, 사진한장에는검은색과흰색만이존재한다고보면된다. 즉, 사진을두가지색으로만나누어문자와바탕으로만생각한다. 흰색종이위에다양한색의문자들이있다면, 이때는흰색을제외한나머지색을검은색으로바꾸어두가지색으로만이루어진이미지를만들면된다. 파싱의기본은문자와바탕이라는두가지색으로만이루어진이미지를만드는것이다. 하지만실제프로그래밍에서는색을바꾸는작업은하지않을것이다. 이작업도 CPU의많은작업을필요로하기때문에프로그램의속도를늦출뿐이다. 다음그림은이미지에서문자를인식하기위해어떻게변환작업을하는지를보여준다. [ 그림 1-1] 은문자색을기준으로나머지를바탕으로만들었고, [ 그림 1-2] 는바탕이외의색을모두문자로판단하여변환하였다. 이때중요한것은변환한후의이미지는검은색문자와흰색바탕으로만이루어졌다는것이다. 무엇을문자로인식하느냐에따라파싱의처음작업은다양하게이루어질수있다. 014 -

그림 1-1 문자색기준의이미지변환 그림 1-2 바탕색기준의이미지변환 앞에서와같이인식할문자가명확하다면파싱작업을하여개별알파벳으로나누면된다. Image Recognition 단어는 16개의알파벳으로나누면되는데나눈문자는 [ 그림 1-3] 과같이개별이미지에꽉차게보일것이다. 즉, 검은색부분을기준으로나누어사각형의테두리에는항상검은색이존재하게된다. 문자를하나씩나누는작업은이미지마다의특성을분석해야한다. 실제이미지는기울어져있을수도있고, 사진속의이미지라면사진을찍는각도에따라이미지가틀어져있을수도있다. 하지만이책에서는쉽게이해하기위해깨끗한이미지를예로사용하여쉬운파싱을할것이다. 문자인식에서가장어려운부분이파싱인데, 다행히도문자와문자사이는겹친부분이없기에파싱이용이하다. 각각의문자가겹쳐있다면인식이불가능할수도있다. [ 그림 1-3] 과같이하나씩나누어진문자이미지는인식을위해크기가같은이미지로변환해야한다. 모든문자는비교할수있는일정한틀안에담아야하기때문이다. 1 OCR 이란무엇인가? - 015

그림 1-3 하나의문자로나누기 [ 그림 1-4] 는가로, 세로의크기가같은사각형안에각알파벳을담은것이다. 하나의문자는늘려질수도있고축소될수도있다. I 아이는사각형안에꽉차게된다. 그렇다면소문자 l 엘은어떻게될까? 이책에서는문자형식을 Arial Type으로진행을하기때문에대문자 I 아이와소문자 l 엘은같은이미지로나타난다. 이러한경우에는문자가처음시작하는문자인지를판단해야하며프로그램으로이부분을해결해야한다. 그림 1-4 크기가같은문자만들기 문자인식프로그램에서는 [ 그림 1-4] 와같이이미지자체를일정한크기로변환하는작업을하지않는다. 이러한작업은속도에영향을주는불필요한작업이므로문자인식프로그램에서는이미지의변환없이바로연산이가능한데이터타입에넣어준다. 파싱을소개하면서쉽게이해하기위해앞에서와같이시각적으로접근하였다. 지금까지의내용을이해하였다면다음내용인데이터타입에하나의문자를넣는작업을쉽게이해할수있을것이다. 1.2 연산이가능한데이터만들기 이미지안의문자는단지그림일뿐이다. 프로그래밍하기위해서는문자이미지를데이터형태로가지고있어야한다. 우리는파싱을통하여문자이미지를검은색과흰색의두가지색으로만표현하였다. 여기에더하여문자의크기도일정하게만들었다. 그렇다면이것을어떻게새로운데이터타입안에담을수있을까? 컴퓨터에서가장작은단위는 bit이며, 하나의 bit는 0과 1의값으로이루어져있 016 -

다. 문자의검은색을 1로바꾸고바탕의흰색을 0으로바꾼후 bit를사각형안에넣는다면앞에서파싱한문자이미지를표현할수있다. 즉, [ 그림 1-5] 처럼 a 라는이미지를 1,536개의 bit로표현하는것이가능하다 ( 가로 32개 세로 48개 = 1,536개 ). [ 그림 1-5] 를보면 a 라는것을쉽게알수있다. 0 과 1 만을가지고도시각적으로 쉽게어떤문자인지를알수있다. 그림 1-5 0 과 1 로표현된문자 a 이와같은방법으로 Image Recognition 이란단어를변환한다면 [ 그림 1-6] 과같이나타날것이다. 그림 1-6 0 과 1 로표현된 Image Recognition 1 OCR 이란무엇인가? - 017

이미지의크기를 32 48의크기안에담은것은이유가있는데, 프로그램언어에서정수형 Integer 데이터타입의크기가 32bits이기때문이다. 즉, 48개의정수 Integer 를하나의새로운데이터타입으로만들면우리는한문자를담는그릇을만든것이다. 연산이가능한데이터타입을만드는것은프로그래머의선택이며, 데이터타입의크기를크게도작게도만들수있다. 이책에서다루게될데이터타입은두가지다. 하나는정수에기반한데이터타입이며, 다른하나는 8 12bits의크기를위한문자형 Character 데이터타입에기반한데이터타입이다. 앞으로작은문자이미지에는작은그릇을사용할것이고, 큰문자이미지에는큰그릇을사용할것이다. 작은이미지를큰데이터타입에넣는것은무의미하고연산을위한속도도더느려지기때문이다. 지금까지의내용이이미지인식의핵심이라할수있다. 어느정도프로그래밍을 018 -

하는독자는이미지인식에어떻게접근해야하는지이해하였을것이다. 이해가 안되었어도앞으로다루는프로그래밍을통하여이미지인식에대하여조금더 깊이있게이해할수있을것이다. 1.3 확률을이용한인식 이미지인식은비교할대상이있어야한다. 여기서는비교를위해만들어진이미 지를기본이미지 Standard Image 라고부르겠다. 이책에서는영문과숫자만인식하는 데, 총 62 개의기본이미지를만들어서사용한다 ( 영문소문자 26 개 + 대문자 26 개 + 숫자 10 개 ). 인식할이미지는 62 개의기본이미지와차례대로비교하며가장근접한이 미지를채택하여결과값으로결정한다. 그렇다면연산할수있게만든데이터로 어떻게 bit 가같은지비교하는지알아보자. 프로그래밍언어의연산자중친근하지는않지만암호프로그래밍등을하면가장 많이사용하는것이 XOR (Exclusive OR, ^) 연산자다. 이책에서도 XOR 연산자 를많이사용할것이다. XOR 연산자의연산결과는다음과같은데, 연산되는 bit 가같으면 0 을, 다르면 1 을결과로나타낸다. A B A^B 0 0 0 0 1 1 1 0 1 1 1 0 그렇다면우리가앞에서연산할수있게만든데이터타입과어떻게비교하면될까? 기본이미지데이터 Standard Image Data 와비교하기위한이미지데이터 Image Data 를위치가같은 bit끼리 XOR 연산하면된다. [ 그림 1-7] 은 a 와 b 두개의이미지데이터를비교한것이다. 1 OCR 이란무엇인가? - 019

그림 1-7 a ^ b 서로다른두개의이미지를비교하면 0과 1의불특정이미지데이터로나타난다. 하지만두개의이미지가동일하다면 XOR 연산자로나타나는이미지는모두 0 으로만나타난다. [ 그림 1-8] 은 a 와 a 를 XOR 연산자로나타낸것인데, 모두 0 으로나타나게된다. 그림 1-8 a ^ a 확률을이용한인식은어떻게이루어질까? 동일한 bit는 0으로표현되기에 XOR 연산의결과값을가지고, 1,536개의 bit 중에 0의숫자가많은것을결과값으로나타내면된다 ( 실제이미지인식에서는모두 0으로나오지않는다 ). 하지만연산을통하여 0이가장많이나온기본데이터를결과로출력하면된다. 인식률이높다는것은확률을이용한결과값이올바른결과값을많이도출한다는것이다. 020 -

1.4 영문이한글보다인식률이높은이유 이책에서다루는문자인식은영문과숫자만을대상으로한다. 영문인식은 62개의기본데이터를만들면되지만, 한글인식은만개이상의기본데이터를만들어야한다. 그런데만개이상의기본데이터를만들기도어렵고인식률도떨어진다. 그렇다면왜한글인식률이높지않은지이미지데이터를가지고알아보자. 그림 1-9 한글이미지데이터 ( 허 ) 이책에서다루는이미지데이터는가로 32개와세로 48개 bit를사용하는데, 이것으로표현할수있는총가짓수는 1,536개다 ( 가로 32개 세로 48개 =1,536개 ). 이이미지데이터로만개가넘는한글을표현하는것은불가능하다. 물론우리는더큰이미지데이터를만들어사용할수있다. 하지만만개의한글을위한기본이미지데이터를만드는것도상당히어려운작업이며, 한문자를인식하기위해서만개의데이터와항상비교해야한다면연산속도가매우느려질것이다. 또한, 정확히써진한글만을인식하는환경이아닌곳에서는이미지변형을수행하여인식률을높여야하는데, 이미지변형으로인하여오히려다른문자로인식할확률이커질수있다. 1 OCR 이란무엇인가? - 021

chapter 3 문서이미지 OCR 이번장에서는문서이미지에서문자를판독해내는 OCR 프로그램을단계적으로구현한다. 이전장에서기본적인부분은구현되었으나, OCR 프로그램의다양한부분에대한깊이있는분석과추가적으로구현해야할부분이상당히많다. 기본적인내용으로시작하지만, 내용이진행됨에따라 OCR에서생각해야할부분을조금더구체적으로알수있으며, 이번장이끝나더라도독자가접하는문서에따라추가적인부분을직접구현할수있는힘을기르기를바란다. 이장에서사용하는문서이미지는 이솝이야기 의내용으로 [ 그림 3-1] 과 [ 그림 3-2] 의두개의파일이다. 먼저프로그램에서는 [ 그림 3-1] 의첫번째내용만을가지고 OCR 프로그램이구현되며, 모든구현이끝난이후에는 [ 그림 3-2] 의내용도 OCR을진행하여프로그램의완성도를검증할예정이다. 실생활에서도문서이미지 OCR을많이사용하고있는데, 대표적으로고급복사기에서많이사용한다. 즉, OCR 기능을가진고급복사기에서는문서를스캔하면 Word 파일로결과가만들어진다. 복사기는문서를스캔하여문서이미지를얻으며, 복사기에설치된자체프로그램이문서이미지를판독하여 Word 문서파일로다시만들어준다. 이기술이발전하여번역프로그램과결합할경우를생각해보자. 책을복사기로복사하면각나라의언어로번역된책이자동적으로만들어질수도있을것이다. 아직까지는번역프로그램의완성도가아주낮기때문에자동번역에대한기능을단시간에만들기는힘들다. 그러나 OCR가자동번역기와함께하는순간우리생활에엄청난변화를가져다줄것이다. 3 문서이미지 OCR - 089

OCR 기술과관련하여생각해볼수있는또한가지는문서를읽어주는프로그램과의결합이다. 복사기에서책을복사하면성우가책을읽어주는소리파일이만들어진다. 이기술은 OCR로인식이끝난문서파일에인간의음성으로읽어주는기술을접목하면된다. 인간의음성으로읽어주는기술은이미시장에서찾아볼수있으나기술이완벽하지는않다. 이는두말이이어져발음되는연음처리에대한기술이아직완벽하지않기때문이다. 어쨌든, OCR 기술이번역, 낭독등의기술과함께할때아주멋진생활의편리함을가져올것임은분명하다. 그림 3-1 이솝우화문서이미지 (aesop_1.png: The Ass And The Load Of Salt) 090 -

그림 3-2 이솝우화문서이미지 (aesop_2.png: The Plane Tree) [ 그림 3-3] 은이번장에서구현되는프로그램의실행화면이다. 파일의이름을입력하고 OCR 버튼만누르면실행되는프로그램으로, 상당히간단하다. Input Picture File 에는인식을위한문서이미지파일이름을넣고, Output Text File 에는인식이끝난후의결과문자들을입력하기위한파일이름을넣는다. OCR 버튼을누르게되면이후에진행되는모든 OCR 관련프로그램함수들이실행된다. 그림 3-3 문서이미지 OCR 프로그램실행화면 3 문서이미지 OCR - 091

[ 코드 3-1] 은 [ 그림 3-3] 의 [OCR] 버튼을눌렀을때실행되는함수로, Image RecognitionDlg.cpp 파일에있는 OnBnClickedBtnRunocr ( ) 함수다. 01 ImageRecognitionDlg.cpp 파일에서는버튼을눌렀을때실행되는 [ 코드 3-1] 의내용이가장중요하며 OCR에서중심이되는함수들은 OCR.h 와 OCR.cpp 에서구현한다. [ 코드 3-1] OCR 버튼을눌렀을때실행되는함수 (ImageRecognitionDlg.cpp) void CImageRecognitionDlg::OnBnClickedBtnRunocr() { UpdateData(TRUE); m_message.format(_t("ocr is Running...")); UpdateData(FALSE); //---1 if (image!= NULL) image.destroy(); HRESULT hresult = image.load(m_inputfile); //---2 if (FAILED(hResult)) { m_message.format(_t("error : Can't Open Input File.")); UpdateData(FALSE); return; } } ocr->runocr(&image, m_outputfile, 50); m_message.format(_t("ocr is Completed...")); UpdateData(FALSE); //---3 //---4 1 실행화면하단의 Press 'OCR' button. 메시지가 OCR is Running 으로바뀐다. UpdateData (TRUE) 는화면의내용을프로그램의각멤버변수내용으로업데이트하고, UpdateData(FALSE) 는멤버변수의내용이화면의내용을바꾸기때문에 m_ message의내용이화면하단의메시지를바꾸게된다. 2 문서이미지파일의이름을저장하고있는 m_inputfile 변수를사용하여이미지를로 01 MFC 프로그램에서버튼등을포함한도구와해당도구와연동되는멤버변수의추가에대해서는 MFC 프로그래밍 : 주식분석프로그램만들기 ( 한빛미디어, 2014) 에서구체적으로설명하였으므로여기서는설명을생략한다. 092 -

드한다. 즉, 문서이미지가 CImage 클래스변수인 image에저장된다. 3 COCR 클래스의멤버함수인 RunOCR을실행해 OCR을진행한다. 이때전달되는파라미터는이미지를담고있는 image, 출력파일이름인 m_outputfile, RGB에서검은색 ( 문자색 ) 을나타내는 50이다. 4 OCR이실행되면화면하단에 OCR is Completed 메시지로종료를알려준다. Dialog 파일에서의구현은이처럼간단하다. 이후에는확률을이용한 OCR의기본개념부터 OCR에추가로구현해야하는내용을단계적으로알아본다. 3.1 확률을이용한 OCR 이전까지기본이미지데이터를만드는방법을알아보았다. 이것은사전이만들어진것으로이해하면된다. 지금부터진행되는 OCR의실행단계는하나의문자를이미지파싱을거쳐서이미지데이터를만든후, 사전과같은기본이미지데이터와비교하여특정문자로결정하는단계다. 3장에서는처음부터단계적으로 OCR을진행하게되는데, 먼저확률을이용한 OCR이어떻게이루어지는지알아볼것이다. 이것이 OCR의가장기본이되는기술이다. 그러나확률을이용해서문자를결정하는방법만으로는인식의한계를알게될것이다. 기본 62개의문자보다더많은특수문자가있으며, 줄바꿈 Enter 과공백 Space 등의부분도구현해야하기때문이다. [ 그림 3-4] 는이번장에서인식할문서이미지인데, 이미지파싱을어디서부터해야하는지를보기위한그림이다. 문서이미지에서는이미지파싱이중간이아닌앞쪽에서이루어져야한다. 심한경우에는한줄에서앞쪽에짧은한단어만이존재할수있기때문이다. 프로그램에서는이부분을문서의가로 Width 크기에서비율 Rate 로비교하여앞쪽에서 0.1부터시작하여 0.3까지픽셀을검사하여한줄을인식하는것으로구현하였다. 3 문서이미지 OCR - 093

그림 3-4 이미지파싱의기준 [ 코드 3-2] 는 COCR 클래스의헤더 header 파일로, 이미지파싱을위해시작되고끝나는가로의비율을처음에 0.1과 0.3으로정의하였다. 이후에구현되는함수를추가로클래스의멤버함수로정의하였다. 이는 2장에서사용한내용과거의유사하며확률을이용하여특정문자로인식하는함수를추가로구현하였다. [ 코드 3-2] COCR 클래스멤버함수 (OCR.h) #define RATE_START_FOR_PARSING 0.1 //---1 #define RATE_END_FOR_PARSING 0.3 //---2 ##### 생략 ##### class COCR { private: CImage *image; Standard standard; AllData alldata; Data *data; //---3 int colortocheck; public: COCR(void); ~COCR(void); void RunOCR(CImage *image, CString outfilename, int colorletter); //---4 void GetStandardImageDataFromBinaryFile(char * filename); //---5 094 -

}; void ParsingStepFirst(); void ParsingStepSecond(int ytop, int ybottom); void ParsingStepThird(Rect *rect); void ParsingStepThird2(Rect *rect); void MakeImageData(); void FindLetterValue(); void StoreLetterToTextFile(CString outfilename); //---6 //---7 1 RATE_START_FOR_PARSING을 0.1로정의한다. 상수변수의이름에서알수있듯이이미지파싱을위한시작비율을나타낸다 ([ 그림 3-3] 참조 ). 2 RATE_END_FOR_PARSING은 0.3으로정의하며이미지파싱을위한마지막부분의비율을나타낸다. 3 기본이미지데이터를저장하는 standard 변수를정의한다. 나머지변수는 2장과동일한목적으로사용되었다. 4 OCR을실행하는함수로, 매개변수로이미지클래스변수인 image, 출력파일의이름, 문자로인식하기위한색의값을가진다. 5 프로그램이실행되면자동으로 COCR 클래스가생성되고, 생성클래스에서자동으로 Get StandardImageDataFromBinaryFile() 함수를실행한다. 즉, 프로그램이실행될때바이너리파일로부터기본이미지데이터를읽어서 Standard 구조체에넣는다. 6 확률을이용하여 Standard 구조체에저장된값과비교하여인식하려는문자의결과값을얻게된다. 7 인식된이미지의결과들을 outfilename의파일이름에텍스트형태로저장한다. [ 코드 3-3] 은 COCR의생성자와프로그램실행화면에서 [OCR] 버튼을선택할때실행되는함수를구현한것이다. 인식하려는문서에서이미지파싱을진행한후각각의문자를이미지데이터로만든다. 그다음기본이미지데이터와비교하여특정문자로인식하고결과파일에저장한다. [ 코드 3-3] COCR 생성자및 OCR 실행함수 RunOCR(OCR.cpp) COCR::COCR(void) { GetStandardImageDataFromBinaryFile("standard.bin"); } //---1 3 문서이미지 OCR - 095

COCR::~COCR(void) { } void COCR::RunOCR(CImage *newimage, CString outfilename, int colorletter) { } image = newimage; colortocheck = colorletter; for (int i =0; i<max_count_data; i++) alldata.data[i].isfixed = false; ParsingStepFirst(); MakeImageData(); FindLetterValue(); StoreLetterToTextFile(outFileName); //---2 //---3 //---4 //---5 //---6 //---7 //---8 1 프로그램이실행될때 COCR 클래스의생성자가실행된다. 바이너리파일에서기본이미지데이터를읽어서기본데이터구조체를만든다. 2 포인터변수 image로인식하려는이미지를가리킨다. 이후에는 image 변수로해당이미지에접근하게된다. 3 문자색을 colortocheck의변수에저장한다. 4 alldata는인식하기위해파싱된모든문자를저장한다. 아직문자가정의되지않았기때문에 isfixed 변수를 false로초기화한다. 이후에문자가확률을통하여특정문자로결정되면 isfixed 변수는 true가된다. 5 이미지파싱을진행하는함수로, 2장에서구현한것과동일하다. 단지, 2장에서는문자선가운데를기준으로나누었다면, 이번에는앞쪽을기준으로나누었다는차이가있다. ParingStepFirst() 함수의설명은 2장에서했으므로여기서는생략한다. 6 이미지파싱된문자이미지를이미지데이터에넣는함수로, 이함수도 2장에서구현한것과동일하므로여기서는설명을생략한다. 7 기본이미지데이터와비교하여확률이가장높은문자를인식하려는문자의결과값으로정의한다. 8 OCR의인식이끝난상태이므로결과값을텍스트파일에저장한다. 096 -