java项目实战:处理图片水印,提取图片信息,生成excel表

article/2025/9/25 23:50:11

  在这次应用软件设计课程中,要求从今年的软件杯大赛上的项目选择一个实现。我选的是"网店工商信息提取",具体要求就是:从给出的带水印的图片中提取出企业名称和企业注册号,并根据这些信息生成excel表格。

  刚刚开始以为这个要求挺难实现的,图片识别好像是很高深的技术啊。但是认真做起来从开工到完成也没花多少时间,并不是我完成了图片识别的代码,而是我用到了谷歌一个图片识别的源码包(TESS4J)。其实不止是图片识别这部分,生成excel表也是用的第三方源码包(感觉好方便)。早知道这么容易,后悔没有报名软件杯。。。

  这样,项目四个模块的功能(水印处理、图片识别、信息提取、生成excel表)我自己实现的其实只有信息提取和水印处理。虽然如此,还是有必要记录一下。

  下面上代码:

  首先是主函数RP.java:

import java.awt.Rectangle;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;import net.sourceforge.tess4j.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.xssf.usermodel.*;public class RP {private String a0="无法识别",c0="无法识别";public void PickUp(String s)             //提取文字中的公司名和注册号{int c1=-1,c2=-1;c1=s.lastIndexOf("号 :");c2=s.indexOf("\n");if(c1!=-1&&c2!=-1){c0=s.substring(c1+4, c2);}int a1=-1,a2=-1;a1=s.indexOf("称 :");a2=s.lastIndexOf("\n");if(a1!=-1&&a2!=-1){a0=s.substring(a1+4, a2);}/*	else{int b1=s.indexOf("名称:");int b2=s.lastIndexOf("有限公司");if(b1!=-1){b0=s.substring(b1+3, b2+2);}}*/}public void toExcel(int i,XSSFWorkbook wb,XSSFSheet sheet)           //将文字信息做成表格{if(i==0)                                                    //第一行的话,就设置列名等属性{XSSFRow row=sheet.createRow(0);XSSFCellStyle style=(XSSFCellStyle)wb.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER);XSSFCell cell=row.createCell(0);cell.setCellValue("企业名称");cell.setCellStyle(style);          cell = row.createCell(1); cell.setCellValue("企业注册号");  cell.setCellStyle(style);}else                                   //不是第一行就将识别到的信息输入表格{XSSFRow row = sheet.createRow(i); row.createCell(0).setCellValue(this.a0);  					row.createCell(1).setCellValue(this.c0); }}public static void main(String[] args) throws IOException {RP rp=new RP();int num=1;Rectangle ret=new Rectangle(0,0,550,80);           //设置一个矩形区域,作为识别部分,减少运行时间提高识别率File root = new File(System.getProperty("user.dir") + "/imgs");//存放处理后的图片,imgs文件夹File res=new File(System.getProperty("user.dir") + "/res");//源图片位置,res文件夹下ITesseract instance = new Tesseract();instance.setLanguage("songti");              //使用训练好中文字库识别XSSFWorkbook wb=new XSSFWorkbook();XSSFSheet sheet=wb.createSheet("信息汇总");rp.toExcel(0,wb,sheet);        //设置列名try {File[] ress = res.listFiles();int i=0;for(File file : ress){i++;WaterMark.Clean(file.getAbsolutePath(),"F:\\eclipse-workspace\\ReadPicture\\imgs\\"+i+".png");}        //去除源图片水印,处理后的图片放到img文件夹File[] files = root.listFiles();for (File file : files) {                        //对去除水印后的图片逐个处理String result = instance.doOCR(file,ret);          //开始采用doOCR(file)效率很低,因为图片内容太多System.out.print(result);rp.a0="无法识别";rp.c0="无法识别";rp.PickUp(result);             //调用信息提取的函数,提取出企业名和企业注册号rp.toExcel(num,wb,sheet);      //调用toExcel函数,将提取到的信息写入num++;}} catch (TesseractException e) {System.err.println(e.getMessage());}try {  FileOutputStream fout = new FileOutputStream("F:\\company imformation\\company.xlsx");  wb.write(fout);  fout.close();  } catch (IOException e) {  e.printStackTrace();  }                 //把写好信息的表输出}}

然后是水印处理的:WaterMark.java:

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.awt.Color;public class WaterMark   {public static void Clean( String frompath,String topath) throws IOException {File file1 = new File(frompath);BufferedImage image = ImageIO.read(file1);for(int i=0;i<550;i++)                    //这里只取x轴550,y轴80区域的像素点,因为需要识别的信息只在这个区域,这样可以节约程序运行时间{for(int j=0;j<80;j++){int pixel = image.getRGB(i, j);        //获得坐标(i,j)的像素int red = (pixel & 0xff0000) >> 16;      int green = (pixel & 0xff00) >> 8;int blue = (pixel & 0xff);              //通过坐标(i,j)的像素值获得r,g,b的值if(red>=10&&red<=20&&green>=10&&green<=20&&blue>=10&&blue<=20)    //组成字符的像素点置为黑色{int cover=new Color(0,0,0).getRGB();image.setRGB(i,j,cover);}else {int white=new Color(255,255,255).getRGB();                   //其他全改为白色image.setRGB(i,j,white);}}}/*for(int i=1;i<550;i++)  //获取一个像素点的四周像素点的rgb,如果这个点的上下都是黑或左右都是黑,则把这个点置为黑。减少失真程度{for(int j=1;j<80;j++){int t=0,d=0,r=0,l=0;int pixeltop = image.getRGB(i, j-1);int redtop = (pixeltop & 0xff0000) >> 16;int greentop = (pixeltop & 0xff00) >> 8;int bluetop = (pixeltop & 0xff);int pixelleft = image.getRGB(i-1, j);int redleft = (pixelleft & 0xff0000) >> 16;int greenleft = (pixelleft & 0xff00) >> 8;int blueleft = (pixelleft & 0xff);int pixelright = image.getRGB(i+1, j);int redright = (pixelright & 0xff0000) >> 16;int greenright= (pixelright& 0xff00) >> 8;int blueright = (pixelright & 0xff);int pixeldown = image.getRGB(i, j+1);int reddown = (pixeldown & 0xff0000) >> 16;int greendown= (pixeldown& 0xff00) >> 8;int bluedown = (pixeldown & 0xff);if(redtop==0&&greentop==0&&bluetop==0){t=1;}if(redleft==0&&greenleft==0&&blueleft==0){l=1;}if(redright==0&&greenright==0&&blueright==0){r=1;}if(reddown==0&&greendown==0&&bluedown==0){d=1;}if(r==1&&l==1)          //上下同时为黑,就把这个点置为黑{int cover=new Color(0,0,0).getRGB();image.setRGB(i,j,cover);}if(d==1&&t==1)       //左右同时为黑,就把这个点置为黑{int cover=new Color(0,0,0).getRGB();image.setRGB(i,j,cover);}}}*/   //其实这个处理步骤没有影响好像也不大,识别率也相当高了(训练了字库的前提下)File file2=new File(topath);ImageIO.write(image,"png",file2);       //图片更改后重新写入另一个文件夹}
}

  这里解释下获取RGB的代码:

int pixel = image.getRGB(i, j);      
int red = (pixel & 0xff0000) >> 16;      
int green = (pixel & 0xff00) >> 8;
int blue = (pixel & 0xff);

  对一个像素点getRGB后得到32位的值,r,g,b的值各占8位,如图:

  


  从右到左即从0到31。加入要获取g,就将像素值和0xff00按位相与,得到一个16位的值,其中低8位全为0,这样再将这个16位的值右移8位就得到了g的值。

  关于训练字库,这是我的同组同学完成的,可以参考这篇博客:

  https://blog.csdn.net/why200981317/article/details/48265621

  在导入所有的需要用到的jar包,并biuld path后,运行程序。源图片是这样的:

  

  经过处理后是这样的:


有一些失真,但是经过训练字库影响不大。  

提取信息生成的excel表格:


简述一下程序的流程:

1.对图片进行去水印处理,这里只处理图片的一部分以节约程序运行时间。

2.用训练好的字库识别图片信息,这里指定只识别部分区域以节约程序运行时间,识别图片信息源码包是TESS4J包.

3.提取图片信息,提取出企业名称和企业注册号信息。

4.用提取到的信息生成excel表格,用到的源码包是poi包。

不知道导入哪些jar包的可以去直接下载:https://download.csdn.net/download/xlantian/10495923。文件有点大是因为字库文件占用空间较大。

最后致谢:训练字库的同学。








http://chatgpt.dhexx.cn/article/H7QYdhYr.shtml

相关文章

nodejs图片读取

response返回都是html/text&#xff0c;向前台输出一张图片用的image/jpeg,服务器读取图片的时候是按照binary的二进制方式读取&#xff0c;给客户端返回的时候也按照binary二进制的方式返回。 从服务器读取一张图片给客户端输出&#xff1a; 效果&#xff1a;输入localhost:…

[软件工具] 如何批量获取图片信息,尺寸、大小、路径、文件名,然后导出表格或者txt的文本,下面教你使用方法

前几天遇到一个比较棘手的需求&#xff1a; 如何获取几万张图片的大量的图片信息&#xff0c;如尺寸、大小、路径、文件名等等&#xff0c; 去看了百度 好多都是教写批处理的文件信息&#xff0c;对批处理不是很懂&#xff0c;写了几次都没成功 然后做这么一款软件&#xff…

APICloud框架——获取本地图片信息

api.getPicture 获取本地图片放置到服务器上或者在app中预览是app的基本功能&#xff0c;今天使用了APICloud框架的api.getPicture这个api获取到的本地图片预览在app中&#xff0c;就像上传qq头像一样&#xff0c;其实就是这个需求&#xff0c;获取本地照片&#xff08;拍摄照片…

imagemagick 获取图片信息,放大缩小,指定区域,旋转,边框,draw png压缩问题

Table of Contents 1.获取图片信息 2.放大缩小 -resize 3.放大缩小 -sample 4.指定区域 5.旋转 6.添加边框 7.draw的用法 1.获取图片信息 C:\Users\Administrator>magick identify F:\imagemagick\1.jpg F:\imagemagick\1.jpg JPEG 1440x2560 1440x256000 8-bit sRGB …

解决透视变换后图片信息丢失的问题

问题背景&#xff1a;最近在做图像拼接&#xff0c;思路是首先对输入的两幅图进行特征提取&#xff0c;提取的方法使用的是经典的SIFT&#xff08;Scale-invariant feature transform&#xff09;算法&#xff1b;然后进行特征匹配&#xff0c;匹配的思路是将一幅图中的特征点以…

wx.getImageInfo(Object object)获取图片信息

微信小程序第一周总结 总结人&#xff1a;陈曦 wx.getImageInfo(Object object)获取图片信息 在小程序/小游戏中使用网络相关的 API 时&#xff0c;每个微信小程序需要事先设置一个通讯域名&#xff0c;小程序只可以跟指定的域名与进行网络通信。包括普通 HTTPS 请求&#xff…

利用Python实现图片信息隐藏

最近上了一门信息隐藏的课,讲的关于技术层面的内容还是蛮多的,但是我也没记住几个。吭吭,言归正传,这两天要交大作业,自己手动实现一种图像信息隐藏,查了一番资料后,决定Python来做(主要是调用包方便),原理很简单,主要利用修改图像RGB通道的某一通道值来隐藏二维信息…

Python获取图片信息小栗子

1.首先我们需要先导入所需要的包&#xff0c;没有的话可以【 pip install ~】 来获取 import requests from lxml import etree 2.接下来我们要进行UA伪装&#xff0c;伪装的目的就是把电脑伪装成人 因为很多wangzahn都有反扒机制&#xff0c;不进行伪装的话根本就无法进行爬…

线性回归用matlab怎么做,matlab中如何应用regress()函数进行线性回归分析?

matlab中如何应用regress()函数进行线性回归分析&#xff1f;回归分析是研究一个随机变量与一个或多个普通变量之间的相关系的统计方法。如果做回归分析&#xff0c;有很多软件都已经封装好了的&#xff0c;我们只需直接调用就可以了。例如Matlab中的regress()就是做线性回归分…

[Matlab]篇----回归分析Matlab命令(regress篇)

[Matlab]篇—-回归分析Matlab命令&#xff08;regress篇) 一、简介 最近在做回归分析方面的东西&#xff0c;网上查阅相关资料&#xff0c;通过实际调试&#xff0c;对调试结果进行总结。 回归分析法指利用数据统计原理&#xff0c;对大量统计数据进行数学处理&#xff0c;并…

回归(Regression )

回归&#xff08;Regression &#xff09; 模型定义 Regression 就是找到一个函数 functionfunction &#xff0c;通过输入特征 x&#xff0c;输出一个数值 Scalar。 模型应用 股市预测&#xff08;Stock market forecast&#xff09; 输入&#xff1a;过去10年股票的变动、…

数学建模:回归分析——regress 函数

matlab中regress 函数 https://jingyan.baidu.com/article/ca41422f6777aa1eae99ed87.htmlhttps://jingyan.baidu.com/article/ca41422f6777aa1eae99ed87.html 结果 附录 1、数据文本&#xff1a;data1_1 0 68 110 121 23 111 100 37 66 110 12 169 50 46 87 117 16 155 25…

[matlab]多元线性回归-regress函数的用法

转载博客原址&#xff1a;https://blog.csdn.net/YinJianxiang/article/details/81464245 回归分析 回归分析 (英语&#xff1a;Regression Analysis) 是一种统计学上分析数据的方法&#xff0c;目的在于了解两个或多个变量间是否相关、相关方向与强度&#xff0c;并建立数学…

机器学习——regression

1 用线性回归找到最佳拟合直线 线性回归 优点&#xff1a;结果易于理解&#xff0c;计算上不复杂 缺点&#xff1a;对非线性的数据拟合不好 使用数据类型&#xff1a;数值型数据和标称型数据。 回归方程&#xff1a;是根据样本资料通过回归分析所得到的反映一个变量&#xff0…

回归问题(Regression)

Regression 前言Dependent vs. Explanatory VariablesHandle Numerical Labelssquared error和variance什么区别 Linear RegressionLinear Regression in 1 Dimension Least Squares &#xff08;最小二乘&#xff0c;重点&#xff09;Least Squares ObjectiveMinimizing a Dif…

Fama-Macbeth回归图形化:EAP.fama_macbeth.Fama_macbeth_regress.plot()

实证资产定价&#xff08;Empirical asset pricing&#xff09;已经发布于Github和Pypi. 包的具体用法(Documentation)博主将会陆续在CSDN中详细介绍&#xff0c;也可以通过Pypi直接查看。 Pypi: pip install --upgrade EAP HomePage&#xff1a; EAP Empirical Asset Prici…

[MATLAB]一元线性回归(regress参数检验说明)

今天学习了统计回归模型&#xff0c;统计回归模型是基于统计理论建立的最基本最常用的一类数据驱动模型。本篇博文主要围绕regress函数的参数进行讲解&#xff01; 一元线性回归模型的概念 这也要从一个女装公司讲起&#xff01; 问&#xff1a;请用函数关系描述身高与腿长的…

matlab中的regress函数总结

clc cleardataxlsread(ty_num.xlsx); %第三列是全区&#xff1b;第四列是偶极子data1xlsread(w_E.xlsx); %第一列是w&#xff0c;第二列是东%设置x的值&#xff0c;第1列全为1 x(:,2)data(:,1); x(:,1)1;ydata1(:,3); [b,bint,r,rint,stats]regress(y,x);b的值为系数&#xff0…

回归(regression)

1. 回归&#xff08;regression&#xff09; 1.1 起源与定义 回归最早是被高尔顿提出的。他通过研究发现&#xff1a;如果父母都比较高一些&#xff0c;那么生出的子女身高会低于父母的平均身高&#xff1b;反之&#xff0c;如果父母双亲都比较矮一些&#xff0c;那么生出的子…

STATA regress回归结果分析

对于STATA回归结果以前一直不清不楚&#xff0c;每次都需要baidu一波&#xff0c;因此今天将结果相关分析记录下&#xff1a; 如上图 上面左侧的表是用来计算下面数据的&#xff0c;分析过程中基本不会用到 右侧从上往下 1.Number of obs 是样本容量 2.F是模型的F检验值&a…