利用Java实现的图片中文字识别,你学会了吗?

一. 背景

今天有粉丝向波哥提出了这样一个疑问:给出一张图片,如何利用Java中的技术获取图片中的文字信息?针对这个问题,你有么有解决办法呢?如果你没有想到好的解决思路,也不用怕,看波哥来给你解决这个问题!

二. 解决思路

首先说到读取文件,我们耳熟能详的肯定就是使用I/O流进行文件的读取,但如果是要将图片里面的文字提取出来又该如何去做呢?

哈哈哈,肯定有同学犯难了,其实我们不妨换个思路。

首先我们想一想,文件的底层是不是就是一个二进制文件呢?当我们想要去获取其中的数据时,是不是会有一些二进制规范呢?我们将这种二进制规范解析出来,是否就能得到文字信息了呢?

三. 代码示例

带着这样的疑问,请大家跟波哥一起通过代码来实现一下吧,下面就是波哥给大家提供的实现代码。

public class Imageparse{
    
    public static void main (String[] args){
          //首先我们需要输入获取图片的路径信息,将其每个点位设置为二进制信息
          Int[][] img = readPic(/*这里输入你的path绝对路径即可*/);
          //将其转为一个一维数组
          int[] bits = new int[img.length * img[0].lenght];
          Int index = 0;
          for(int i = 0; i < img.lenght;i++){//这段代码是查看解析的二维数组是否正确
            for(int j = 0;j<img[i].length;j++){
              bits[index++] = img[i][j];
            }
          }
          //读取数组信息
          parseUTF(bits);
    }
  
    public static int readPic(String path){
          //这里我们就需要涉及到去拿去所有的数据  rgb  信息,有一个图片  IO  流
          BufferedImage image = ImageIO.read(new FileInputStream(new File(path)));
          //获取这个图片的宽和高
          int width = image.getWidth();
          int height = image.getHeight();
          //创建一个当前图的最大宽高的二维数组
          int[][] img = new int[height][width];
          //到这里我们就该去把每个点位赋值
          for(int i = 0;i<height;i++){
            for(int j = 0;j<width;j++){
              Int       rgb       = image.getRGB(j,i);//此时这是一个二进制颜色代码
              //条件判断颜色转为      RGB      ,例如(255,0,0)
              int r = (rgb & 0x00ff0000) >>16 ; 
              int g = (rgb & 0x0000ff00) >>8 ;
              int b = (rgb & 0x000000ff) ;
              int  a = 0xff /2; 
              if(r > a && g > a && b > a){
                img[i][j] = 0;
              }else{
                img[i][j] = 1;
                }
            }
          }
          return img;
     }

    public static void  parseUTF(int[] bits){
        int index = 0;
        int count = 0;
        for(int j = 0;j<bits.lenght;){
          if(bits[j]==1){
            count++;
            index++;
          }else{
            index++;
            String str = "";
            if(count == 0){
              for(int k=1;k<=7;k++){
                str += bits[index++];
              }
            }else {
              for(int x = 0;x<8-(count+1);x++){
                str+=bits[index++];
              }
            }else{
              for(int y = 0;y<count-1;y++){
                index+=2;
                for(int z = 0;z<6;z++){
                  str+=bits[index++];
                } 
                }
            }
            count = 0;
            System.out.print((char)Integer.parseInt(str,2));
            str="";
          }
          j=index;
        }
    }
}

接下来,来跟随波哥看看代码实际展现的最终效果吧:

四. 测试图片

下面这种图片,供大家用于测试上面的代码,你可以把波哥上面的代码运行起来,试试看能不能把下面图片中的文字识别出来。

如果你识别出来的结果是一首诗就对了哦。

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马剑威(威哥爱编程)

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值