selfstarter

문자인식... 을 도전했으나 실패 본문

Server/Java

문자인식... 을 도전했으나 실패

selfstarter 2020. 6. 15. 17:57

딥러닝말고 간단하게 글자이미지를 배열화 시켜서 배열끼리 일치하는지 확인해서 문자를 판별하면 어떨까?

생각해서 다음과 같이 테스트코드를 만들었다.

문자 이미지를 2d array로 변경 후 다른 이미지들과 비교한다

다른 이미지들은 글자 위치가 살짝 변경된 것, 다른 글씨체, 다른 크기, 다른 글자로 비교했다.

결과는 원본만 인식가능;;;

아래 결과에선 자기 글씨체가 아닌 글자보다 다른 글자가 100퍼센트율이 더 높다;;

다른 글씨체는 궁서체이다. 영수증 인식을 하고 싶어서 지금 테스트 코드를 작성한건데..

너무 오버했나?? 무난한 글씨체로 하면 괜찮으려나 싶기도 하고..

결론은 좋은 방법은 아닌 것 같다.

 

자기것과 비교 : 100.0
가 이미지와 위치만 다른 것 비교 : 92.38754
가 이미지와 글씨체가 다른 이미지 비교1 : 84.083046
가 이미지와 글씨체가 다른 이미지 비교2 : 88.92734
가 이미지와 다른 글자 비교 : 83.39101

 

소스출처:

https://stackoverflow.com/questions/54183892/how-to-convert-an-image-to-int-in-java

 

How to convert an image to int[][] in java?

I loaded a binary image and I want to convert it to 2D array, in particular int[][]: public int[][] ImageToArray(String pathImage) throws IOException { File file = new File(pathImage);

stackoverflow.com

 

 

package test;

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;


public class Main {
	private static int RESIZE_WIDTH = 13;
	private static int RESIZE_HEIGHT = 13;
	private static int ALL_ARRAY_COUNT = RESIZE_WIDTH * RESIZE_HEIGHT;
	
	public static void main(String[] args) {
		int [][] ga = changeFile("ga");
		int [][] ga1 = changeFile("ga1");
		int [][] ga2 = changeFile("ga2");
		int [][] ga3 = changeFile("ga3");
		int [][] u = changeFile("u1");

		System.out.println("자기것과 비교 : "+checkSameRate(ga, ga));
		System.out.println("가 이미지와 위치만 다른 것 비교 : "+checkSameRate(ga, ga1));
		System.out.println("가 이미지와 글씨체가 다른 이미지 비교1 : "+checkSameRate(ga, ga2));
		System.out.println("가 이미지와 글씨체가 다른 이미지 비교2 : "+checkSameRate(ga, ga3));
		System.out.println("가 이미지와 다른 글자 비교 : "+checkSameRate(ga, u));
	}
	
	public static int[][] changeFile(String fileName) {
		System.out.println("=============== fileName:"+fileName+"===============");
		File file = new File(fileName+".png");
		BufferedImage bufferedImage;
		try {
			bufferedImage = ImageIO.read(file);
			bufferedImage = resize(bufferedImage, RESIZE_WIDTH, RESIZE_HEIGHT);
			System.out.println("file생성성공?"+ImageIO.write(bufferedImage, "png", new File("./resize_"+fileName+".png")));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		
		WritableRaster wr = bufferedImage.getRaster();
		int [][] imageArray = new int [wr.getHeight()][wr.getWidth()];
		for (int i = 0; i < wr.getHeight(); ++i) {
			for (int j = 0; j < wr.getWidth(); ++j) {
				int pixel = wr.getSample(j, i, 0);
				if (pixel == 255) {
					pixel = 0;
				} else {
					pixel = 1;
				}
				imageArray[i][j] = pixel;
				System.out.print(pixel+" ");
			}			
			System.out.println("");
		}
		return imageArray;
	}
	
	public static int checkSameRate(int[][] ori, int[][] compar) {
		int sameCount = 0;
		for (int i = 0; i < RESIZE_WIDTH; ++i) {
			for (int j = 0; j < RESIZE_HEIGHT; ++j) {
				if (ori[i][j] == compar[i][j]) {
					++sameCount;
				}
			}
		}
		System.out.println("sameCount:"+sameCount);
		return sameCount / ALL_ARRAY_COUNT * 100;
	}
	
	 private static BufferedImage resize(BufferedImage img, int height, int width) {
	        Image tmp = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
	        BufferedImage resized = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
	        Graphics2D g2d = resized.createGraphics();
	        g2d.drawImage(tmp, 0, 0, null);
	        g2d.dispose();
	        return resized;
	    }
}

 

 

 

 

Comments