Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Firebase
- R프로그래밍
- Android Apk 이름
- Kotlin
- error
- css
- Java
- spring
- release unsigned
- Android Apk
- html
- apache gzip
- MySQL
- Eclipse
- 안드로이드
- release Apk
- jQuery
- JavaScript
- tomcat
- Exception
- java error
- Android
- CSS사용법
- fragment
- DataTable
- Android Apk 이름 변경
- FLUTTER
- Program type already present
- android error
- android fragment
Archives
- Today
- Total
selfstarter
문자인식... 을 도전했으나 실패 본문
딥러닝말고 간단하게 글자이미지를 배열화 시켜서 배열끼리 일치하는지 확인해서 문자를 판별하면 어떨까?
생각해서 다음과 같이 테스트코드를 만들었다.
문자 이미지를 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
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;
}
}
'Server > Java' 카테고리의 다른 글
Java Calendar 쓸 때 유의 사항 (0) | 2020.06.25 |
---|---|
ArrayList 생성과 동시에 초기화 하기 (0) | 2020.06.19 |
Java Reflection으로 class 정보 가져오기 (0) | 2020.06.05 |
Java instanceof example (0) | 2020.05.30 |
No enclosing instance of type Myani is accessible in Java (0) | 2020.05.30 |
Comments