增强 扫描王 源码_OpenCV探索之路(二十二):制作一个类“全能扫描王”的简易扫描软件...

本文介绍了如何利用OpenCV开发一个类似“扫描全能王”的工具,包括图像信息区域提取与矫正、二值化和图像增强等步骤。通过二值化、高斯滤波、膨胀和Canny边缘提取找到轮廓,再筛选出最大面积的轮廓,然后通过霍夫变换找出四边形轮廓的四个顶点,最后应用透视变换实现图像矫正。
摘要由CSDN通过智能技术生成

相信很多人手机里都装了个“扫描全能王”APP,平时可以用它来可以扫描一些证件、文本,确实很好用,第一次用的时候确实感觉功能很强大啊算法很牛逼啊。但是仔细一想,其实这些实现起来也是很简单的,我想了下,实现的步骤应该就只有下面三个:

将证件轮廓找到

提取证件矩形轮廓四点进行透视变换

二值化

知道原理之后,我马上利用强大的opencv开发一个类似“全能扫描王”扫描工具。

整理一下我们要制作的这个扫描工具有哪些功能:

图像的信息区域的提取与矫正

图像的二值化

锐化和增强

第二第三点都非常简单,那么制作这个工具的难点完全落在了第一点“ 图像的信息区域的提取与矫正”上了。在编码实现的过程中,确实有很多坑需要踩一踩。

我们先展示一下效果,我们有这么一个用手机拍摄的图片

经过扫描工具一番处理后变成这样子。也就是说,我们将原图中的那个文件抠了了出来,并且完成矫正。

实现过程查阅了大量资料,也看了网上很多类似的博客,前辈们实现过相类似的透视变换的代码,但是他们的代码实现的都不理想,很多图片根本没法检测。不过还是可以从前人的经验中获取到很多好想法的,所以先列出一些有借鉴的博客:

正式实现

第一步,二值化+高斯滤波+膨胀+canny边缘提取

一开始我是没有采取形态学处理的,仅仅是二值化+高斯滤波+canny边缘提取的策略,但是实际运行下效果并不好,原因在于有一些图片的信息区域轮廓没法闭合,这就导致了信息区域轮廓没法提取。但是加入适当的膨胀后,效果就好多了。

Mat src = imread("1.png");

imshow("src img", src);

Mat source = src.clone();

Mat bkup = src.clone();

Mat img = src.clone();

cvtColor(img, img, CV_RGB2GRAY); //二值化

imshow("gray", img);

//equalizeHist(img, img);

//imshow("equal", img);

GaussianBlur(img, img, Size(5, 5), 0, 0); //高斯滤波

//获取自定义核

Mat element = getStructuringElement(MORPH_RECT, Size(3, 3)); //第一个参数MORPH_RECT表示矩形的卷积核,当然还可以选择椭圆形的、交叉型的

//膨胀操作

dilate(img, img, element); //实现过程中发现,适当的膨胀很重要

imshow("dilate", img);

Canny(img, img, 30, 120, 3); //边缘提取

imshow("get contour", img);

}

轮廓提取效果如下:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值