앞서 설정은 다 끝났으니
이제 전처리된 이미지를 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 |