150 likes | 619 Views
Technical seminar. Image Processing for OCR using Matlab. 이근호 fiadot@gmail.com http://www.fiadot.com. July 25,2007. Contents. About Matlab Drawing Binarization Labelling Segmentation Normalize Q&A. Matlab. 매트웍스사에서 개발한 수치 해석 및 프로그래밍 환경을 제공하는 공학용 소프트웨어
E N D
Technical seminar Image Processing for OCRusing Matlab 이근호 fiadot@gmail.com http://www.fiadot.com July25,2007
Contents • About Matlab • Drawing • Binarization • Labelling • Segmentation • Normalize • Q&A
Matlab • 매트웍스사에서 개발한 수치 해석 및 프로그래밍 환경을 제공하는 공학용 소프트웨어 • 행렬을 이용한 처리가 용이하며, 함수와 데이터의 그래프 표현이 가능하며, 또한 알고리듬의 적용, 사용자 인터페이스 생성 및 다른 프로그래밍 언어와의 연결도 가능 • 각종 내장 함수를 포함한 이같은 기능을 활용해서 과학, 공학 분야에 있어서의 제반문제를 빠르게 풀 수 있으며, 수치 해석에 특화된 소프트웨어이지만 메이플심볼릭 엔진과의 연동을 가능케하는툴박스(추가 기능)를 적용하면 완전한 컴퓨터 수식처리 시스템으로도 기능 • 그 밖의 각종 툴박스 패키지를 이용하면 더욱 확장된 기능을 사용할 수 있음
Drawing • 창하나에 이미지 뿌리기 % 파일명imgdraw.m pszFileName = 'arial_10pt_6x7.tif'; % 파일명(string제어)font 패턴 데이터 raw_rgbimage = imread(pszFileName); % 이미지 파일을 읽어서raw_rgimage에 load info = imfinfo(pszFileName); % 이미지 파일 정보 출력 imshow(raw_rgbimage); % 이미지를 창에 출력 * 글자 출력 disp('으하하하')
Drawing (Cont’d) • 창 2개에 각각 이미지 뿌리기 pszDBFileName = 'arial_10pt_6x7.tif'; % 파일명(string제어)font 패턴 데이터 raw_rgbimage = imread(pszDBFileName); % 이미지 파일을 읽어서raw_rgimage에 load info = imfinfo(pszDBFileName); % 이미지 파일 정보 출력 disp(raw_rgbimage); %imshow(raw_rgbimage); % 이미지를 창에 출력 imshow(raw_rgbimage(:,:,:,1)) % 문자인식할 이미지 pszSrcFileName = 'arial_16pt_9323.tif'; % 이미지 파일을 읽어서raw_rgimage에 load raw_rgbimage2 = imread(pszSrcFileName); figure, imshow(raw_rgbimage2(:,:,:,1))
Drawing (Cont’d) • 창하나에 2개 이미지 출력하기 pszDBFileName = 'arial_10pt_6x7.tif'; % 파일명(string제어)font 패턴 데이터 raw_rgbimage = imread(pszDBFileName); % 이미지 파일을 읽어서raw_rgimage에 load info = imfinfo(pszDBFileName); % 이미지 파일 정보 출력 disp(raw_rgbimage); subplot(1,2,1), imshow(raw_rgbimage); pszSrcFileName = 'arial_16pt_9323.tif'; % 문자인식할 이미지 raw_rgbimage2 = imread(pszSrcFileName); % 이미지 파일을 읽어서raw_rgimage에 load subplot(1,2,2), imshow(raw_rgbimage2);
Drawing (Cont’d) • <console 화면> (:,:,3) = Columns 1 through 16 255 0 0 0 255 255 255 255 0 255 255 255 255 0 0 0 0 255 255 255 0 255 255 0 0 255 255 255 0 255 255 255 0 255 255 255 0 255 0 255 0 255 255 255 255 255 255 255 0 255 255 255 0 255 255 255 0 255 255 255 255 255 255 0 0 255 255 255 0 255 255 255 0 255 255 255 255 255 0 255 0 255 255 255 0 255 255 255 0 255 255 255 255 0 255 255 255 0 0 0 255 255 255 255 0 255 255 255 0 0 0 0 Columns 17 through 32 … <생략> Columns 49 through 60 255 0 0 0 255 255 255 0 0 0 255 255 0 255 255 255 0 255 0 255 255 255 0 255 0 255 255 255 0 255 0 255 255 255 0 255 255 0 0 0 255 255 0 255 255 255 0 255 0 255 255 255 0 255 255 0 0 0 0 255 0 255 255 255 0 255 0 255 255 255 0 255 255 0 0 0 255 255 255 0 0 0 255 255 >>
Binarization [i,map] = imread('trees.tif'); imshow(i); i1 = ind2rgb(i,map); figure; imshow(i1) i2= ind2gray(i,map); figure; imshow(i2) i3 = im2bw(i,map,0.5); figure; imshow(i3)
Labelling L = 1 1 1 0 0 0 0 0 1 1 1 0 2 2 0 0 1 1 1 0 2 2 0 0 1 1 1 0 0 0 3 0 1 1 1 0 0 0 3 0 1 1 1 0 0 0 3 0 1 1 1 0 0 3 3 0 1 1 1 0 0 0 0 0 [r,c] = find(L==2); rc = [r c] rc = 2 5 3 5 2 6 3 6 bwlabel % 1차원 데이터에 대해서~ Label connected components in a binary image 사용법 L = bwlabel(BW,n) [L,num] = bwlabel(BW,n) 사용예 BW = [1 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 1 0 0 0 0 0]; L = bwlabel(BW,4)
Labelling (Cont’d) • bwlabeln % N차원 이미지에 대해서 라벨링해줌 Label connected components in N-D binary image Example BW = cat(3,[1 1 0; 0 0 0; 1 0 0],... [0 1 0; 0 0 0; 0 1 0],... [0 1 1; 0 0 0; 0 0 1]) bwlabeln(BW) ans(:,:,1) = 1 1 0 0 0 0 2 0 0 ans(:,:,2) = 0 1 0 0 0 0 0 2 0 ans(:,:,3) = 0 1 1 0 0 0 0 0 2
Labelling(Cont’d) • 실제 사용예) 이미지가 배경이 흰색이고 글자가 검정일 때! pszSrcFileName = 'arial_16pt_9323.png'; % 문자인식할 이미지 raw_rgbimage2 = imread(pszSrcFileName); % 이미지 파일을 읽어서raw_rgimage에 load LabledData = bwlabel(~raw_rgbimage2); % inverse시켜줌으로써 흑백 바꿈! figure, imshow(LabledData == 2); % 2번에 해당하는 이미지만 뿌려줌! * Whos명령어 Name, Size, Byte, Class를 보여줌 >> whos Name Size Bytes Class LabledData 18x54 7776 double array info 1x1 5060 struct array pszDBFileName 1x18 36 char array pszSrcFileName 1x19 38 char array raw_rgbimage 7x60x3 1260 uint8 array raw_rgbimage2 18x54 972 logical array
Segmentaion 나누어진 문자 하나의 크기를 확인한다. 결과> splited char size 12 7 stats = regionprops(LabledData,'FilledImage'); newmap = [stats(3).FilledImage]; % disp(newmap); 라벨링후 3에 해당하는 이미지 영역을 긁어서newmap에 새로운 2차원 배열을 복사 생성한다. 결과> 0 0 1 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 [h w] = size(newmap); disp('splited char size'); disp(h); disp(w);
Normalization • 사이즈를 DB에 맞게 resize 시켜준다. scaleH = 6 ; scaleW = 7 ; J = imresize(newmap,[scaleWscaleH]); % Try varying the scale factor. disp(J); 여기에 다양한 보간(Interpolation) 방법이 있는데 그냥 기본으로 했다.
Q&A Thank you