java-opencv投影法提取内容

前言

投影法是最近学到的一个opencv内容提取和分割技巧,就好像前面一篇文章java-opencv再谈表格识别用到的技巧感觉很惊艳。了解了后思路很简单,但是做好也蛮难的因为干扰因素太多了,这里只是简单的用个demo分享下这个技巧。

基本思路

  1. 核心思想就是统计。
  2. 投影法分为水平和垂直两个方向。
  3. 首先把图像二值化。因为二值化后图像就是白(255)和黑(0)了。
  4. 水平法就是统计水平的白或者黑的个数。然后通过一些平均值或者根据图片特性预估的值过滤掉一些数据(因为有干扰项和文字自身的个性吧每个字的水平像素点不是均等的,可以看下面图片)。
  5. 计算其均值、方差等统计量,或者进行阈值分割
  6. 垂直法和水平思路一样。
  7. 通过水平和垂直我们可以得到坐标,如果是文字识别的话我们可以通过切割然后OCR就可以得到我们想要的东西。
  8. 最后结合之前的一些方式提取内容最终都不是万能的(受一些不确定参数的影响),但AI的万能兼容的模式多?脑回路受限了。
  9. 解决了我之前遇到的问题就是非表格内容的提取,关于表格的识别提取我前面文章写了一些思路。二者结合起来加上实际情况可以处理一些有标题和一些重要内容的且下面带表格的(例如回单)。当然更好的出路是用机器学习了进行切割(最近我入门了tensorflow的图像分割,用身份证号区域做了一个demo,后面我是想把生成的模型用opencv进行加载但是遇到了些问题还没解决)

投影水平发demo

通过demo说下上面的问题,算法很简单但是想要出好的结果不容易。图片样例加demo很容易理解的。

java 复制代码
public static List<Integer> cutImgX2(Mat mat){
    int i, j;
    int nWidth = mat.width(), nHeight = mat.height();
    int[] xNum = new int[nHeight], cNum;
    // 记录像素的平均值,这里的像素平均值也可以通过下面统计然后通过一些算法求出个平均数
    // 我这里demo直接写了个阈值 最简单点根据高度求个平均值然后过滤一点
    // 这里的影响我在上面第4点说过了,下面我贴个图以看就直到了,干扰和文字的影响
    int average = 100;
    // 统计出每行黑色像素点的个数
    for (i = 0; i < nHeight; i++) {
        for (j = 0; j < nWidth; j++) {
            //黑色点统计 也可以是别的颜色
            if (mat.get(i, j)[0] == 0) {
                xNum[i]++;
            }
        }
    }

    List<Integer> cutY = new ArrayList<Integer>();
    int lastIndex=0;
    for (i = 0; i < nHeight; i++) {
    //这里是过滤和保存高度的坐标
    //lastIndex我这里主要是项分割出文字的开始高度和结束高度
    //通过上面图片看可能更直观点
        if (xNum[i] > average && (lastIndex==0|| i-lastIndex>20)) {
            cutY.add(i);
            lastIndex=i;
        }
    }
    return cutY;
}
相关推荐
追随者永远是胜利者6 分钟前
(LeetCode-Hot100)64. 最小路径和
java·算法·leetcode·职场和发展·go
heimeiyingwang33 分钟前
企业非结构化数据的 AI 处理与价值挖掘
大数据·数据库·人工智能·机器学习·架构
学习是生活的调味剂34 分钟前
nacos原理之服务注册浅析
java·开发语言·nacos·注册中心
没有bug.的程序员1 小时前
Arthas 深度进阶:线上问题非侵入式诊断内核、方法级监控与线程阻塞排查实战指南
java·arthas·线上问题·非侵入式·方法级监控·线程阻塞
亓才孓1 小时前
[Mybatis]Mybatis框架
java·数据库·mybatis
跟Tom学编程—一对一编程辅导1 小时前
基于 Java 的 SSM 架构电子商城项目毕业设计课题选型指导文档|名企高级开发工程师全程一对一指导(含详细文档+源码+部署)
java·架构·毕业设计·课程设计
编程小风筝2 小时前
编写java代码如何写文档注释?
java·开发语言
与衫2 小时前
如何将SQLFlow工具产生的血缘导入到Datahub平台中
java·开发语言·数据库
m0_475064502 小时前
SpringAI-1-集成DeepSeek
java
好家伙VCC2 小时前
**发散创新:编译器优化实战——从LLVM IR到性能飞跃的奇妙旅程**
java·开发语言·python·算法