앞서 설정은 다 끝났으니

이제 전처리된 이미지를 Ocr 하는것이 더 잘 되는지 실험해본다. 

 

테스트 클래스 생성!! 

import org.opencv.core.Core; 
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgproc.Imgproc;

public class OpenCVTest {
	 private static final int 
     CV_THRESH_OTSU = 8,
     CV_THRESH_BINARY = 0,
     CV_ADAPTIVE_THRESH_MEAN_C = 0;
	 
	static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
	
	 public static void main(String[] args) {
		 try {
			String path= "경로상생략/img/";
			String target = path + "tttt.jpg";
		    	
	    	// 변환할 이미지를 저장할 객체 
			Mat gray = new Mat();
			Mat resized = new Mat();
			Mat blured = new Mat();
			Mat equalized = new Mat();
			Mat Threshold = new Mat();
			
			// image read 
			Mat img = Imgcodecs.imread(target,Imgcodecs.IMREAD_UNCHANGED);
			
			// GrayScale
			Imgproc.cvtColor(img, gray, Imgproc.COLOR_RGB2GRAY);
	
			// 밝기 조절  
			//gray.convertTo(gray, -1, 1, 150);
	
			// blur 
			Imgproc.GaussianBlur(gray, blured, new Size(0, 0), 1);
				
			// 이진화
			Imgproc.threshold(blured, Threshold, 0, 255,  CV_THRESH_OTSU + CV_THRESH_BINARY);
				
			Imgproc.adaptiveThreshold(Threshold, Threshold, 255, CV_ADAPTIVE_THRESH_MEAN_C ,CV_THRESH_BINARY, 99, 4);
	
			// Resize
			Size sizeLenna = new Size(img.width()*2, img.height()*2);
			Imgproc.resize(Threshold, resized, sizeLenna);
				
	
			// Equalized 
			Imgproc.equalizeHist(resized, equalized);
			
            // 변환된 이미지를 저장한다.
			Imgcodecs.imwrite(path+"/res.jpg", resized);
			
			// 변환된 이미지를 보여준다.
			HighGui.imshow("res", resized);
			HighGui.waitKey();
			
			// tesseract 적용
			File image = new File(path+"res.jpg");
			Tesseract tesseract = new Tesseract();
	    		tesseract.setDatapath("경로상 생략/tessdata");
			    tesseract.setLanguage("eng");
                      tesseract.setOcrEngineMode(1);
					
			String result = tesseract.doOCR(image);
			System.out.println(result);
			
			
		} catch (TesseractException e) {
			e.printStackTrace();
		}
		
			

			 
    }

}

 

설명) 

openCV에서 제공되는 여러가지 이미지 편집 기능이 있다. 

검색해보니 대부분 OCR 이전 전처리로 진행하는 순서들이 있었는데 

먼저 graySacle를 한 뒤 blur 처리 > 이진화 > 평탄화 작업을 하는거 같아 

그대로 진행해보았고, 내가 필요한건 스캔된 문서이미지를 읽어보는건데 

스캔했을때 특유의 스프레이같은 것들이 있어서 밝기 조절로 좀 지워보려고 추가해 보았다.

 

작업물을 보자. 

전)

결과 

 

 

OpenCV로 전처리한 후 

 

결과)

 

 

 

느낀점 ) 

검색해봤던 여러가지 방식을 테스트 해보았다. 

알려진 방법대로 이미지를 전처리한 뒤 확인해보니

이게 더 잘 보인다고? 하는 생각이 드는 경우가 있었다..

생각해보니 사람이 보는 이미지와 컴퓨터가 읽기 좋은 이미지는 다를테니  

어떻게 해주면 더 잘 읽어줄지 좀 더 고민을 해봐야할거 같다. 

 

결론) 

손글씨를 읽기는 역부족이다.  꼭 필요하다면 상용화된 서비스를 유료로 사용해야겠다..

( 구글에서 제공하는 유료 서비스는 잘 읽었음.. ) 

yolo 프레임웍이라는게 있다는데,, 직접 OCR을 만들어보고 싶다. 

'OCR' 카테고리의 다른 글

Java + OpenCV 사용법  (0) 2022.04.08
[Maven] Tesseract 사용법  (0) 2022.04.08
OCR 알아보기 시작!!  (0) 2022.04.07

1. 먼저 Tesseract 라이브러리를 불러온다

maven 사이트 접속해서 오늘날짜 기준 가장 최신버전으로 선택했다. 

https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j/5.2.0

 

2. pom.xml에 dependency 추가. 

<dependency>
	<groupId>net.sourceforge.tess4j</groupId>
	<artifactId>tess4j</artifactId>
	<version>4.5.2</version>
</dependency>

 

3. 테스트를 위한 Class 생성 ! 

import java.io.File;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;


public class OcrTest {
		
	 public static void main(String[] args) {
		 try {
		    // 읽어볼 이미지를 가져온다. 
		    File image = new File("경로상생략/res.jpg");

                    Tesseract tesseract = new Tesseract();
                    tesseract.setDatapath("경로상생략/tessdata"); //** 학습된데이터가 있는 폴더를 지정해준다. 
                    tesseract.setLanguage("eng"); // 언어설정 
                    tesseract.setPageSegMode(1); // 페이지 모드 설정
                    tesseract.setOcrEngineMode(1); 
                    // tesseract.setHocr(true); // html로 그려주는 flag
                    String result = tesseract.doOCR(image);
                    System.out.println(result);

		 
		 } catch (TesseractException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		 }
		 
		 
	 }

}

  

 tesseract.setDatapath("경로상생략/tessdata");  이 라인은 tesseract가 이미지를 읽었을때 

비교할 학습된 데이터 파일의 경로를 가르킨다. 

아래 링크에 접속해보면 이미 학습된 데이터를 제공하고 있으므로 내가 하고자 하는 언어를 다운받아서 넣어두면 된다. 

https://github.com/tesseract-ocr/tessdata

 

GitHub - tesseract-ocr/tessdata: Trained models with support for legacy and LSTM OCR engine

Trained models with support for legacy and LSTM OCR engine - GitHub - tesseract-ocr/tessdata: Trained models with support for legacy and LSTM OCR engine

github.com

 

접속해보면 아래와 같은 파일들이 나오는데 앞 글자가 언어를 가르키고 있다. 

 

나는 영문과 중문이 필요하므로 아래 이미지와 같이 구성하였다. 

 

 

테스트로 사용한 이미지 

 

결과 ) 

 

 

결론)

위에 올린 이미지 말고도 여러개의 이미지를 테스트 해보았으나 

연습용 정도의 퀄리티만 나올 뿐, 업무에 적용해보긴 어려울거 같다는 판단이 든다. 

 

어떻게 하면 인식률을 올릴 수 있을까? 

 OpenCV 라이브러리를 이용해 이미지 흑백으로 바꾸고 블러등등.. 을 이용해

이미지를 더 깔끔하게 만들어 준다면  인식하는데 효과가 있다고한다.

OpenCV 적용을 해보도록한다. 

 

* 손글씨는 50% 정도만 인식되는걸로 보임. 

 

'OCR' 카테고리의 다른 글

[JAVA] OpenCV + Tesseract 사용법  (0) 2022.04.08
Java + OpenCV 사용법  (0) 2022.04.08
OCR 알아보기 시작!!  (0) 2022.04.07

+ Recent posts