基于OpenCV进行文本分块切割

本文介绍了如何利用OpenCV进行文本分块切割,通过投影检测法找到文本行的边界。首先,通过水平投影找到波峰确定行切割位置,然后进行垂直投影处理可能的切割错误,如汉字或数字被切分。通过图像处理优化,最终实现较好的文本块切割效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设有如下一张图,如何把其中的文本分块切割出来,比如“华普超市朝阳门店”、“2015-07-26”就是两个文本块。

wKiom1W4ivayh50VAAKNdHomsEA740.jpg


做图像切割有很多种方法,本文描述一种最直观的投影检测法。先来看看什么是投影,简单来说,投影就是在一定方向上有效像素的数量。来看个直观的图像:

wKiom1W4iwvQfJiCAAGye-xnAXA489.jpg


这是一张水平投影图与原图的对比,从投影图上能看到多个波峰,文字多的地方,投影就长,行间的空白处,投影为0。 上个示例代码:

public void HorizontalProjection()
{
    //以灰度图方式读入源文件
    string filename = "source.jpg";
    var src = IplImage.FromFile(filename, LoadMode.GrayScale);

    //二值化,采用阈值分割法
    Cv.Threshold(src, src, 0, 255, ThresholdType.BinaryInv | ThresholdType.Otsu);

    //存储投影值的数组
    var h = new int[src.Height];

    //对每一行计算投影值
    for(int y = 0;y < src.Height;++y)
    {
        //遍历这一行的每一个像素,如果是有效的,累加投影值
        for(int x = 0;x < src.Width;++x)
        {
            var s = Cv.Get2D(src, y, x);
            if(s.Val0 == 255)
                h[y]++;
        }
    }

    //准备一个图像用于画投影图
    var paintY = Cv.CreateImage(src.Size, BitDepth.U8, 1);
    Cv.Zero(paintY);

    //画图
    var t = new CvScalar(255);
    for(int y = 0;y < src.Height;++y)
    {
        for(int x = 0;x < h[y];++x)
            Cv.Set2D(paintY, y, x, t);
    }

    //显示
    using(var window = new CvWindow("Source"))
    {
        window.Image = src;
        using(var win2 = new CvWindow("Projection"))
        {
            win2.Image = paintY;
            Cv.WaitKey();
        }
    }
}


显然找出波峰对应的y值,就能把行切割开了。 得到一行以后,可以采用类似的思想进行垂直投影,挑了一行测试一下,效果如下:

wKioL1W4jXKBQ6VqAACvzlb6mf4672.jpg


可以看到效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值