java 分析图片文字大小时,剔除部分异常数据,思路梳理(格拉布斯准则)
1、本來需求是: 將拍照的圖片,根據合適的比例縮放、擴大放到word文檔
問題是:如何合適的要放大縮小的比例
比如:圖片很大,文字很小;文字集中在一塊;文字圖片上傳傾斜;圖片中含有 如函數圖
解決方案:
1、將圖片切割成幾部分
2、通過BufferedImage 掃描圖片
3、縱向掃描,掃描過程中,該行像素不是 ("#ffffffff")(全白) 就歸類為一個字(且連續),計算這個字的高度,放到集合中
4、去掉極端的數據:不滿足一個字的最低高度( 比如 一個橫線,一個點...)
5、經行格列布斯準則,根據波動異常 剔除掉 異常數據
6、將剔除了異常數據的 數據,取 平均值, 得到 這此掃描 較為合理的 字體高度
7、字體高度 與 標準字號 H5 字體高度的比值,來定需要 放大;縮小的比例
truncat 這個接口需要 進入 5 格列布斯 準則, 案例
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.imageio.ImageIO;
public class JustStudy {
? ? String openUrl; // 原始圖片打開路徑
? ? int part;//需要切割成幾份掃描
? ? public JustStudy(String openUrl,int part) {
? ? ? ? this.openUrl = openUrl;
? ? ? ? this.part = part;
? ? }
? ? /**
? ? ?* 得到文字行與圖片高度
? ? ?*/
? ? public float getFontHeight(){
? ? ? ? float result = 0f;
? ? ? ? int[] startRow;// 字起始行
? ? ? ? int endRow = 0;// 字結束行
? ? ? ? File file = new File(openUrl);
? ? ? ? BufferedImage bimg=null;// 將圖片緩沖到內存中,BufferedImage生成的圖片在內存里有一個圖像緩沖區
? ? ? ? if(null!=file){
? ? ? ? try {
? ? ? ? ?? ?bimg= ImageIO.read(file);
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? System.out.println("未找到圖片");
? ? ? ? }
? ? ? ? //將該圖片切割成幾份
? ? ? ? List<BufferedImage> cutImage = randomCut(bimg,part);
? ? ? ? ArrayList<Double> hignNums = new ArrayList<>();
? ? ? ? for (BufferedImage litleBimg : cutImage) {
? ? ? ? ?? ?int [][]data = new int[litleBimg.getWidth()][litleBimg.getHeight()];
? ? ? ? ? ? startRow = new int[litleBimg.getHeight()];
? ? ? ? ? ? int n = 0;
? ? ? ? ? ? //通過getRGB()方式獲得像素矩陣 : 此方式為沿width方向掃描
? ? ? ? ? ? for(int y=0;y<litleBimg.getHeight();y++){
? ? ? ? ? ? ? ? for(int x=0;x<litleBimg.getWidth();x++){
? ? ? ? ? ? ? ? ? ? data[x][y]=litleBimg.getRGB(x,y);
? ? ? ? ? ? ? ? ? ? // 該行像素不是 ("#ffffffff")即全白 就歸類為一個字
? ? ? ? ? ? ? ? ? ? if (!("ffffffff".equals(String.format("%x",data[x][y])))){
? ? ? ? ? ? ? ? ? ? ? ? startRow[n] = y;//統計該字體高度
? ? ? ? ? ? ? ? ? ? ? ? n++;
? ? ? ? ? ? ? ? ? ? ? ? break;//一行只記一個
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? int k = 0;
? ? ? ? ? ? //用來計一個字的向上延展有多少像素
? ? ? ? ? ? int[] hignSpace = new int[startRow.length];
? ? ? ? ? ? int temp = 0;
? ? ? ? ? ? for (int i=0;i<startRow.length;i++) {
? ? ? ? ? ? ?? ?//除第一行,需要連續
? ? ? ? ? ? ? ? if (i != startRow.length-1 && !((startRow[i+1]-startRow[i]) == 1)){
? ? ? ? ? ? ? ? ? ? if (k ==0){
? ? ? ? ? ? ? ? ? ? ?? ?hignSpace[k] = startRow[i] - startRow[0];
? ? ? ? ? ? ? ? ? ? }else {
? ? ? ? ? ? ? ? ? ? ?? ?hignSpace[k] = startRow[i] - temp;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? temp = startRow[i+1];
? ? ? ? ? ? ? ? ? ? k++;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? System.out.println("各個間隔:" + Arrays.toString(hignSpace));
? ? ? ? ? ? //去掉極端數據
? ? ? ? ? ? int[] newArray = cutZero(hignSpace);
? ? ? ? ? ? System.out.println("去除極端數據:"+Arrays.toString(newArray));
? ? ? ? ? ? ArrayList<Double> dataDouble = new ArrayList<>();
? ? ? ? ? ? for(int i=0 ; i<newArray.length;i++){
? ? ? ? ? ? ?? ?dataDouble.add((double)newArray[i]);
? ? ? ? ? ? }
? ? ? ? ? ? Truncat truncat = new Truncat(dataDouble);
? ? ? ? ? ? //處理波動較大的數據
? ? ? ? ? ? truncat.calc();
? ? ? ? ? ? System.out.println("處理過后:"+dataDouble.toString());
? ? ? ? ? ? double pingJunJianGe = truncat.calcAverage(dataDouble);
? ? ? ? ? ? System.out.println("平均間隔:" + pingJunJianGe);
? ? ? ? ? ? hignNums.add(pingJunJianGe);
?? ??? ?}
? ? ? ? Truncat truncat = new Truncat(hignNums);
? ? ? ? //處理波動較大的數據
? ? ? ? truncat.calc();
? ? ? ? System.out.println("處理過后:"+hignNums.toString());
? ? ? ? double pingJunJianGe = truncat.calcAverage(hignNums);
? ? ? ? System.out.println("平均間隔:" + pingJunJianGe);
? ? }else{
? ? ?? ?System.out.println("文件讀取有誤,請確認文件地址");
?? ?}
? ? ? ? return result;
? ? }
? ? /**
? ? ?* 去掉極端數值
? ? ?* @param oldArr
? ? ?* @return
? ? ?*/
? ? private int[] cutZero(int[] oldArr) {
? ? ? ? int zero=0;
? ? ? ? for(int i=0;i<oldArr.length;i++){
? ? ? ? ? ? if(oldArr[i]<8){
? ? ? ? ? ? ? ? zero++;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? int newArr[]=new int[oldArr.length-zero]; // 定義新的數組 長度是 原來舊的數組的長度減去0的個數
? ? ? ? int j=0; // 新數組的索引
? ? ? ? for(int i=0;i<oldArr.length;i++){ // 遍歷原來舊的數組
? ? ? ? ? ? if(oldArr[i]>=8){ // 假如不等于0
? ? ? ? ? ? ? ? newArr[j]=oldArr[i]; // 賦值給新的數組
? ? ? ? ? ? ? ? j++;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return newArr;
? ? }
? ??
? ? /**
? ? ?* 把一張圖片垂直等分
? ? ?*
? ? ?* @param bimg
? ? ?* @param time
? ? ?* @return
? ? ?*/
? ? private List<BufferedImage> randomCut(BufferedImage bimg, int time) {
? ? ? ? ArrayList list = new ArrayList();
? ? ? ? int width = bimg.getWidth();
? ? ? ? int sPerTime = width / time;
? ? ? ? for (int i = 0; i < time; i++) {
? ? ? ? ? ? BufferedImage newBuffer = bimg.getSubimage(i * sPerTime, 0, sPerTime, bimg.getHeight());
? ? ? ? ? ? list.add(newBuffer);
? ? ? ? }
? ? ? ? return list;
? ? }
? ? public static void main(String [] args){
// ? ? ? ?JustStudy JustStudy1 =
// ? ? ? ? ? ? ? ?new JustStudy("F:/錯題圖片/1.jpg","F:/錯題圖片","1","jpg");
// ? ? ? ?JustStudy1.getFontHeight();
// ? ? ? ?JustStudy JustStudy2 =
// ? ? ? ? ? ? ? ?new JustStudy("F:/錯題圖片/2.jpg","F:/錯題圖片","2","jpg");
// ? ? ? ?JustStudy2.getFontHeight();
// ? ? ? ?JustStudy JustStudy3 =
// ? ? ? ? ? ? ? ?new JustStudy("F:/錯題圖片/3.jpg","F:/錯題圖片","3","jpg");
// ? ? ? ?JustStudy3.getFontHeight();
// ? ? ? ?JustStudy JustStudy4 =
// ? ? ? ? ? ? ? ?new JustStudy("F:/錯題圖片/4.jpg","F:/錯題圖片","4","jpg");
// ? ? ? ?JustStudy4.getFontHeight();
// ? ? ? ?JustStudy JustStudy5 =
// ? ? ? ? ? ? ? ?new JustStudy("F:/錯題圖片/5.jpg","F:/錯題圖片","5","jpg");
// ? ? ? ?JustStudy5.getFontHeight();
// ? ? ? ?JustStudy JustStudy6 =
// ? ? ? ? ? ? ? ?new JustStudy("F:/錯題圖片/6.jpg","F:/錯題圖片","6","jpg");
// ? ? ? ?JustStudy6.getFontHeight();
// ? ? ? ?JustStudy JustStudy7 =
// ? ? ? ? ? ? ? ?new JustStudy("F:/錯題圖片/7.jpg","F:/錯題圖片","7","jpg");
// ? ? ? ?JustStudy7.getFontHeight();
// ? ? ? ?JustStudy JustStudy8 =
// ? ? ? ? ? ? ? ?new JustStudy("F:/錯題圖片/8.jpg","F:/錯題圖片","8","jpg");
// ? ? ? ?JustStudy8.getFontHeight();
// ? ? ? ?JustStudy JustStudy9 =
// ? ? ? ? ? ? ? ?new JustStudy("F:/錯題圖片/9.jpg","F:/錯題圖片","9","jpg");
// ? ? ? ?JustStudy9.getFontHeight();
// ? ? ? ?JustStudy JustStudy10 =
// ? ? ? ? ? ? ? ?new JustStudy("F:/錯題圖片/10.jpg","F:/錯題圖片","10","jpg");
// ? ? ? ?JustStudy10.getFontHeight();
? ? ? ? JustStudy JustStudy11 =
? ? ? ? ? ? ? ? new JustStudy("F:/錯題圖片/11.jpg",5);
? ? ? ? JustStudy11.getFontHeight();
? ? }
總結
以上是生活随笔為你收集整理的java 分析图片文字大小时,剔除部分异常数据,思路梳理(格拉布斯准则)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软考高项比中项在难度上高多少?
- 下一篇: lammps后处理:Python调用Ov