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();

    }

猜你喜欢

转载自blog.csdn.net/weixin_42178492/article/details/81630907