앞서 설정은 다 끝났으니

이제 전처리된 이미지를 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

+ Recent posts