Emgucv不完整图像分割试验(十七)——字符切割&内轮廓判定

本篇比较水,但估计挺多人需要的。。。

前提:老版本Emgucv用的contour保存轮廓,所以内外轮廓直接就能用Nnest和Pnext或者层数区分开,但新的VVP始终找不到办法,项目又着急需要,就硬着头皮强推了一波。

项目需要字符切割,但不是简单的图,给出的图片都是拍摄质量不高的(质量好的也不会找到我,命苦)所以噪点很多。

常规字符切割步骤:滤波(高斯或双边),二值然后根据轮廓的形状或位置切割

但这一波图片比较麻烦,常规的滤波很难(google好像有基于人工智能的图像增强可以试试,但对方项目又要求速度,诶~),我这的思路有干扰就好好利用干扰,拍照噪点多且模糊的话肯定就是两种情况,文字区域比较稳定(题外话,说到稳定,想到了MSER算法,opencv下有emgucv下没有,郁闷来。),非文字区域肯定比较斑驳,那么比较区域内的纹理应该能区分出文字还是背景,如此,遇到6/8/9/0等有内部区域的字符肯定需要把内轮廓处理出来。

如上才发现了emgucv现在没办法区分内外轮廓的问题,我没办法了,就想用C#自带的List的差集来做,结果又发现了个新的Bug,VectorOfPoint没办法做==的判断,我用第一个元素Point来比较,先对付了一下。

内外轮廓获取以及VectorOfVectorOfPoint转List代码如下:

... ... 
VectorOfVectorOfPoint VVPFCCOP = new VectorOfVectorOfPoint();
            VectorOfVectorOfPoint VVPFEXT = new VectorOfVectorOfPoint();
            Mat b1 = new Mat();
            Mat b2 = new Mat();

            CvInvoke.FindContours(gray, VVPFCCOP, b1, RetrType.Ccomp, ChainApproxMethod.ChainApproxNone);
            CvInvoke.FindContours(gray, VVPFEXT, b2, RetrType.External, ChainApproxMethod.ChainApproxNone);
            //double weight = gray.Size.Width * gray.Size.Height / 8;
            

            List LCCOP = VP_TO_lIST(VVPFCCOP);//全部轮廓
            List LEXT = VP_TO_lIST(VVPFEXT);//外部轮廓
            List LunEXT = L1_EXCEPT_l2(LCCOP, LEXT);//算出内轮廓
... ...
        //VVP转List
        //本想用list的差集直接得结果的,结果VVP格式C#不认识,诶~~
        private List VP_TO_lIST(VectorOfVectorOfPoint vvp)
        {
            List newList = new List();

            for (int i = 0; i < vvp.Size; i++)
            {
                newList.Add(vvp[i]);
            }

            return newList;
        }

        //两个VP求差集
        private List L1_EXCEPT_l2(List L1, List L2)
        {
            List newList = new List();

            for (int i = 0; i < L1.Count; i++)
            {
                bool flag = false;
                for (int j = 0; j < L2.Count; j++)
                {
                    //不知道轮廓怎么判断,只能用第一个点判断了
                    //有兴趣的可以完善下去
                    if (L1[i][0] == L2[j][0])
                        flag = true;
                }

                if (!flag)
                    newList.Add(L1[i]);
            }

            return newList;
        }

Emgucv不完整图像分割试验(十七)——字符切割&内轮廓判定_第1张图片

Emgucv不完整图像分割试验(十七)——字符切割&内轮廓判定_第2张图片

下一步如何根据纹理或者其他方式排除掉干扰项参见下一篇。

总之,脱离了了好的图像处理的图像识别都是耍流氓,要更好的识别效果一定要配合好的图像处理,所以磨刀不误砍柴工,想弯道超车做图像识别的朋友,有空了也要回头补补图像处理,这是我的心得体会,以上,应该是我这个系列的最后一部分了。

另,我的那本《Emgucv 学习与设计 农业篇》的书,几大电商平台应该都能搜到,但我没授权过,出版社私自流出的,需要系统学的买他们的也行,支持正版的到咸鱼上搜搜捧个场更好(咸鱼买书的都有我微信,有问题随时问不定时回答)。

 

你可能感兴趣的:(Emgucv不完整图像分割试验(十七)——字符切割&内轮廓判定)