[计算机视觉] A4纸边缘检测

您所在的位置:网站首页 坐标纸图片a4 [计算机视觉] A4纸边缘检测

[计算机视觉] A4纸边缘检测

2024-06-25 03:46| 来源: 网络整理| 查看: 265

这次作业真的是再见再见……虽然最后写出的代码没多少行,但是很烧脑,需要用到很多高中的几何数学知识(差不多忘光了_(:зゝ∠)_)和一些算法。然后最后写完发现有些方法挺巧妙的,所以在这里分享一下。

先把作业要求放上来吧:

输入图分辨率:3120*4208

(输入图像的红色部分仅为马赛克处理哈,原输入图像不存在)

好,那接下来po一下做出的效果图:

(边缘有点细_(:зゝ∠)_,得仔细看才能看出。用时也给出来了,四舍五入后 1张图片的处理到最后显示只用9秒。)

为什么提了时间呢?因为上面也提到了,输入图像的分辨率大得感人啊微笑不做点处理都不知道跑到什么时候才能跑出结果。好了,下面会先大概说一下整个处理的所有步骤,接着会有每个步骤的详细解释。

处理步骤:

1、先对输入图像进行灰度化处理,再按一定比例下采样(即对图像插值压缩)

2、利用上一次作业的Canny算法提取边缘(得到的边缘有噪点且不完整)

3、对ImageSpace做HoughSpace(极坐标)变换,并做voting投票(矩阵累加)

4、对累加矩阵取最大的一些值,得到边缘直线的斜率、截距,并画出边缘直线

5、求每两条直线之间交点,并累计该交点的直线交叉次数

6、取交叉次数最多的4个点,即为A4纸的四个顶点

7、把顶点坐标上采样并放回原图,最后4个顶点之间连线,形成边缘

步骤详细解释:

1、先对输入图像进行灰度化处理,再按一定比例下采样(即对图像插值压缩):

      (1)灰度化处理:这个不用详细说了,都是数字图像的处理方法。灰度转化公式I = r * 0.299 + g * 0.587 + b * 0.114。

      (2)下采样:由于原图是3120*4208的分辨率,刚好都是8的倍数,所以我通过插值将宽高都变成原来的1/8,即390*526。插值方法网上很多教程啦,自己找下吧大笑

      @问题@:为什么可以进行下采样?会有精度丢失吗?

      @回答@:(这纯属我个人理解哈)首先,做下采样肯定是为了提高减少运行时间啦,上面也提到了处理分辨率如此高的一张图片最后只用了9 秒。而说到精度,精度丢失肯定会有的啦~~只是可以设想一下,如果原来边缘在图像的高度的1/4处,那我不管怎么放大缩小,那边缘还是在图像的高度的1/4处啊~~从上面的处理结果来看,其实效果我觉得还是可以的,虽然有一定误差,但是应该在可以接受的范围吧_(:зゝ∠)_

步骤1结果(这步骤都是简单的图像处理,所以就不放代码啦~~):

   

2、利用上一次作业的Canny算法提取边缘(得到的边缘有噪点且不完整):

      我上次的作业改的code0的代码啊。400多行,就不放上来了_(:зゝ∠)_  改一下那份代码就能用了。

步骤2结果:

  

3、对ImageSpace做HoughSpace(极坐标)变换,并做voting投票

      课件上有介绍直接的Hough坐标变化b = -x * m + y(不用极坐标),但是输入图像的很多直线的截距b都特别大(最大的接近1w),这样的累加矩阵就会很大很大!所以我用了极坐标控制矩阵大小。变换及几何意义如下:

      好了,有了这些几何知识就可以编码了。先声明一个累加矩阵:360 * ((x + y) * 2)。宽360是360度,高原来又平方又开方太复杂了,所以直接用更大(可接受范围)的矩阵,乘2倍,是把负的部分平移上来可以累加。

      然后编码思路:先在canny提取的边缘图像上,对于边缘点得到x、y。然后在Hough空间,对每一个θ,由x、y计算出ρ:

void HoughEdgeDetect::HoughTransAndDetectEdge() { cimg_forXY(SrcCannyImg, x, y) { if (SrcCannyImg(x, y, 0) == 255) { //cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3