构建文档扫描仪-600学习网

600学习网终身会员188,所有资源无秘无压缩-购买会员

本文将使用OpenCV创建一个简单的文档扫描仪,就像普通的相机扫描仪应用程序一样。这个想法很简单,因为我们认为文档是四边形。我们得到边缘的位置并用它来抓取文档本身,忽略无用的图像背景。

简单流水线:加载图像>>检测边缘和抓取位置>>使用图像上的位置

导入程序包

首先,我们导入处理图像可能需要的包。threshold_local函数对您来说可能是新的,但这段代码没有什么特别之处。此函数来自scikit图像包。

#导入包

from skiage.filters导入阈值_本地

将numpy导入为np

导入cv2

导入imutils

加载图像。

在这里,我们加载图像并保留副本。在这里,原始副本对于获得清晰和未修改的图像扫描非常重要。为了处理图像,我将其调整到合理的比例。接下来,我对图像进行灰度化,以减少颜涩并使其模糊(即,帮助从图像背景中去除高频噪声)。这些都是为了找到文件的边缘。

#在图像中加载

image=cv2.imread(“images/questions.jpg”)

orig=image.copy()

#调整图像大小。

高度=图像形状[0]

宽度=图像形状[1]

比率=0.2

宽度=int(比率*宽度)

高度=int(比率*高度)

image=cv2.resize(图像,(宽度,高度))

#在图像中找到边缘。

灰涩_缩放=cv2.cvt颜涩(图像,cv2.COLOR _ BGR2GRAY)

#模糊图像

灰涩_缩放=cv2.高斯模糊(灰涩_缩放,(5,5),0)

#边缘检测

边缘=cv2.Canny(灰涩,50,200)

cv2.imshow(“图像”,图像)

cv2.waitKey(0)

cv2.imshow(“检测到边缘”,边缘)

cv2.waitKey(0)

慕课、黑马、极客时间、小码哥、拉钩、尚硅谷、开课吧等千套课程打包VIP套餐,IT课程一网打尽

慕课、黑马、极客时间、小码哥、拉钩、尚硅谷、开课吧等千套课程打包VIP套餐,IT课程一网打尽

找到轮廓。

使用cv2.findcontours()查找轮廓。接下来,我们使用imutils库来获取轮廓。最后,我们根据最大轮廓面积对捕获的轮廓进行排序。在这种情况下,我保留了最大的5

#在边缘图像中找到轮廓。只保留最大的轮廓。

轮廓=cv2.findContours(eded.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

#抓斗轮廓

等高线=最小值。抓取等高线(等高线)

#根据尺寸选择轮廓。

轮廓=已排序(轮廓,键=cv2.contourArea,反向=True)〔:5〕

轮廓被进一步处理。

首先,我们遍历轮廓并找到周长,这是将周长近似为一点所必需的。在这个操作完成后,我们最终搜索一个正好有4个点的轮廓,这很可能是一张近似矩形的纸。之后,我们得到这些点的坐标,然后将它们初始化为纸张轮廓。

#在轮廓上循环。

对于等高线中的等高线:

周长=cv2.arcLength(轮廓,真)

#近似你的轮廓

近似值=cv2.approxPolyDP(轮廓,0.02*周长,真)

#如果我们的轮廓有4个点,那么肯定应该是纸。

如果len(近似值)==4:

纸_轮廓=近似

打破

使用坐标,下一步是绘制轮廓,这非常简单。

#绘制找到的轮廓。

cv2.drawContours(图像,[纸张_轮廓],-1,(225,0,0),2)

cv2.imshow(“找到轮廓”,图片)

cv2.waitKey(0)

慕课、黑马、极客时间、小码哥、拉钩、尚硅谷、开课吧等千套课程打包VIP套餐,IT课程一网打尽

你心里的问题是,我们完成了吗?

嗯,你可能会说是的,因为你在图像周围有一个很好的轮廓。答案是否定的,为了获得最佳的图像扫描形式,我们需要90度的图像视图,尤其是倾斜时。为此,我们将创建一个函数来处理此任务。

管道:布置点>>标记点>>实像选择点

arrange_points函数。

要做到这一点的方法非常简单,多亏了Adrian Roserock(博士)。这个函数背后的直觉是,我们得到文档四条边的坐标,并将它们排列在我们认为应该的位置。我花了一些时间给出了描述的图形表示。

慕课、黑马、极客时间、小码哥、拉钩、尚硅谷、开课吧等千套课程打包VIP套餐,IT课程一网打尽

慕课、黑马、极客时间、小码哥、拉钩、尚硅谷、开课吧等千套课程打包VIP套餐,IT课程一网打尽

点坐标之和

1) 从上图中,我们可以看到点坐标(X,Y)的最大和位于右上角。

2) 点的最小和是左下角点。

点坐标差

3) 点坐标的最大差值为左上角

4) 点坐标差的最小值是左下角。

密码

此函数接受参数点。接下来,我初始化一个NumPy数组以表示矩形。数组是一个4×2矩阵,因为我们有4个点和2个坐标(x,Y)。

最后,如上所述,我注册矩形的点(点的和和点的差)。最后,我正确地返回了矩形的坐标。

定义排列_点(点):

#初始化将排序的坐标列表

#第一个入口为左上角,第二个入口为右上角

#第三个条目是右下角,第四个/最后一个点是左下角。

矩形=np.零((4,2),dtype=”float32″)

#左下角应为最小和

#右上角的点将具有最大的点数和。

sum_points=points.sum(轴=1)

矩形[0]=点[np.argmin(和_点)]

矩形〔2〕=点〔np.argmax(和_点)〕

#右下角的差异最小

#左上角的差异最大。

diff_点=np.diff(点,轴=1)

矩形〔1〕=点〔np.argmin(diff_点)〕

矩形〔3〕=点〔np.argmax(diff_点)〕#坐标的返回顺序。

返回矩形

设置四个点。

这个函数非常简单。当然,这里的想法是将纸张拉直,只提取所需的区域。这里,输入是1)图像本身和点或坐标。首先,我们使用我们创建的第一个函数”arrange_points”来排列函数的点。接下来,我相应地分配了这些点,因为我已经安排好了这些点并给它们命名了。

计算

为了计算,只需要两点之间的距离就可以找到每边的长度。这样,我们就可以防止图像在正确位置上的错误调整。顾名思义,目的地是图像的新视图。其中[0,0]表示左上角。接下来,[Max width-1,0]表示右上角,我们也有[maxwidth-1,maxheight-1]表示底部的右下角,最后是左下角[0,maxheight-1]。

变换矩阵

当动作完成并且工作完成时,我们需要使用cv2.getPerspectiveTransform()完成转换矩阵,它接受矩形和点的目标。现在我们有了一个矩阵,我们使用cv2.warpPerspective()来应用它。它获得您提供给函数的图像和变换矩阵,最后建议扫描(宽度和长度)。全部完成,返回转换后的图像

#设四分。

def设置_四个_点(图像,点):

#获得点数顺序并打开包装。

矩形=排列_点(点)

(左上.右上.右下.左下)=矩形

让我们来计算矩形的宽度。

#使用两点间距离公式

左_高度=np.sqrt((上_左[0]-下_左[0])**2)+

右_高=np.sqrt((上_右[0]-下_右[0])**2)+

顶部_宽度=np.sqrt((顶部_右[0]-顶部_左[0])**2)+(顶部_左[1]-顶部_左[1])*

底部_宽度=np.sqrt((底部_右[0]-底部_左[0])**2)+(底部_左[1]-底部__左[1]])*

maxheight=max(int(左高度),int(右高度))

maxwidth=max(int(顶部宽度),int(底部宽度))

目的地=np.array(〔

[0,0],

[maxwidth-1,0]

[maxwidth-1,maxheight-1]

〔0,maxheight-1〕〕,dtype=”float32″)矩阵=cv2.getPerspectiveTransform(矩形,目标)

warped=cv2.warpPerspective(图像,矩阵,(maxwidth,maxheight))

回程翘曲

应用程序功能

我们已经创建了该函数,因此我们将其应用于最初保存的原始图像。第二个输入是论文的大纲。我通过移除我在开始时所做的缩放,将纸的轮廓恢复到原来的大小。要获得图像的黑白感觉,您需要使用阈值局部,但当然,如果您想以彩涩扫描图像,您根本不需要它。最后,我调整大小并显示。

翘曲=设置_四个_点(原稿.纸_轮廓.整形(4,2)*(1/比))

#翘曲=cv2.cvt颜涩(翘曲,cv2.COLOR_BGR2GRAY)

#阈值=阈值_局部(扭曲,11,偏移=10,方法=”高斯”)

#翘曲=(翘曲>阈值).astype(“uint8”)*255

#显示原始图像和扫描图像

打印(“正在进行图像重置”)

cv2.imshow(“原始”,cv2.resize(原始,(宽度,高度)))

cv2.imshow(“扫描”,cv2.resize(翘曲,(宽度,高度))

cv2.waitKey(0)

慕课、黑马、极客时间、小码哥、拉钩、尚硅谷、开课吧等千套课程打包VIP套餐,IT课程一网打尽

慕课、黑马、极客时间、小码哥、拉钩、尚硅谷、开课吧等千套课程打包VIP套餐,IT课程一网打尽

干得好您刚刚创建了自己的扫描仪应用程序。

免责声明: 1、本站信息来自网络,版权争议与本站无关 2、本站所有主题由该帖子作者发表,该帖子作者与本站享有帖子相关版权 3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和本站的同意 4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责 5、用户所发布的一切软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 6、您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 7、请支持正版软件、得到更好的正版服务。 8、如有侵权请立即告知本站,本站将及时予与删除 9、本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章和视频仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。
600学习网 » 构建文档扫描仪-600学习网