全能扫描王app里面有一个对图像进行矫正的功能,实际上是通过四点法的仿射变换来进行操作的。选取文档的四个角点,然后计算仿射变换矩阵来对图像进行矫正。下面通过一段python程序来进行简单实现,功能为:通过顺时针点击文档的左上,右上,右下,左下四个角点来对其进行图像矫正。代码如下:

# coding=utf-8
# 导入相应的python包
import numpy as np
import cv2def order_points(pts):# 参考ref[1]# 初始化坐标点rect = np.zeros((4, 2), dtype = "float32")# 获取左上角和右下角坐标点s = pts.sum(axis = 1)rect[0] = pts[np.argmin(s)]rect[2] = pts[np.argmax(s)]# 分别计算左上角和右下角的离散差值diff = np.diff(pts, axis = 1)rect[1] = pts[np.argmin(diff)]rect[3] = pts[np.argmax(diff)]return rectdef four_point_transform(image, pts):#参考ref[1]# 获取坐标点,并将它们分离开来rect = order_points(pts)(tl, tr, br, bl) = rect# 计算新图片的宽度值,选取水平差值的最大值widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))maxWidth = max(int(widthA), int(widthB))# 计算新图片的高度值,选取垂直差值的最大值heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))maxHeight = max(int(heightA), int(heightB))# 构建新图片的4个坐标点dst = np.array([[0, 0],[maxWidth - 1, 0],[maxWidth - 1, maxHeight - 1],[0, maxHeight - 1]], dtype = "float32")# 获取仿射变换矩阵并应用它M = cv2.getPerspectiveTransform(rect, dst)# 进行仿射变换warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))# 返回变换后的结果return warpeddef on_mouse(event, x, y, flags, param):global timg, pointsimg2 = timg.copy()point0 = (0, 0)if event == cv2.EVENT_LBUTTONDOWN:         #左键点击point1 = (x,y)points.append([x,y])print(x,y)cv2.circle(img2, point1, 4, (0,255,0), 4)cv2.imshow('origin', img2)return point0if __name__ == '__main__':global points, timg xscale, yscale = 0.5, 0.5  # 通过放大图像来使得点击位置更加精确points = []oimg = cv2.imread('test.png')oshape = oimg.shapetimg = cv2.resize(oimg, (int(oshape[1]/xscale), int(oshape[0]/yscale))) # 放大图像print(timg.shape)cv2.imshow('origin', timg)cv2.setMouseCallback('origin', on_mouse)cv2.waitKey(0)   # 点完4个角点之后随便按一个键盘按键结束操作cv2.destroyAllWindows()points = np.array(points, dtype=np.float32)points[:,0] *= oshape[1] / int(oshape[1]/xscale)  # 还原像素位置的大小points[:,1] *= oshape[0] / int(oshape[0]/yscale)warped = four_point_transform(oimg, points)# cv2.imwrite('warped.png', warped ) # 保存图像cv2.imshow('origin', warped)cv2.waitKey(0) cv2.destroyAllWindows()

实验效果如下:

原始图片:

点击四个角点:

随便按一个键盘按键结束操作,随后显示矫正后的图像:

Done!

Reference:

[1]. https://blog.csdn.net/wzz18191171661/article/details/99174861

                                                                                                #一天天的不务正业

【python实现图像矫正 全能扫描王!】相关推荐

  1. OpenCV实现“全能扫描王”的图像矫正功能

    前言: 相信很多人手机里都装了个"扫描全能王"APP,平时可以用它来可以扫描一些证件.文本,确实很好用,第一次用的时候确实感觉功能很强大啊算法很牛逼啊.但是仔细一想,其实这些实现起 ...

  2. 基于 requests 的全能扫描王爬虫实践

    投稿人:Alan 摘要:全能扫描王是文件扫描留档的重要工具,本文利用requests爬虫将手机客户端的扫描文件,同步至电脑端. 一.背景 在审计工作中,需要大批量扫描文件留档,全能扫描王成为主流的手机 ...

  3. 制作一个类“全能扫描王”的简易扫描软件(opencv)

    相信很多人手机里都装了个"扫描全能王"APP,平时可以用它来可以扫描一些证件.文本,确实很好用,第一次用的时候确实感觉功能很强大啊算法很牛逼啊.但是仔细一想,其实这些实现起来也是很 ...

  4. OpenCV制作一个类“全能扫描王”的简易扫描软件

    转自:https://www.cnblogs.com/skyfsm/p/7324346.html 相信很多人手机里都装了个"扫描全能王"APP,平时可以用它来可以扫描一些证件.文本 ...

  5. 【OpenCV】 ⚠️实战⚠️ 女子深夜久久不能入眠,300行写出全能扫描王! ☢️建议手收藏☢️

    [OpenCV] ⚠️实战⚠️ 女子深夜久久不能入眠,300行写出全能扫描王! ☢️建议手收藏☢️ 概述 图像透视 获取透视矩阵 透视变换 预处理 其他函数 主函数 输出结果 最终转换结果 概述 今天 ...

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

    相信很多人手机里都装了个"扫描全能王"APP,平时可以用它来可以扫描一些证件.文本,确实很好用,第一次用的时候确实感觉功能很强大啊算法很牛逼啊.但是仔细一想,其实这些实现起来也是很 ...

  7. Python 五行代码实现类似全能扫描王和office Lens的扫描彩色增强滤镜效果

    安装第三方cv工具包:zisan pip install zisan zisan 开源的Github源码库:https://github.com/JintuZheng/zisan 项目代码持续更新维护 ...

  8. 智能扫描王 v1.0.0

    类型:系统工具 版本:v1.0.0 大小:8.1M 更新:2019/3/4 语言:简体 等级: 平台:安卓, 4.0以上 下载地址: 智能扫描王 v1.0.0(1) 智能扫描王 v1.0.0(2) 智 ...

  9. Touch - 全能名片王

    很喜欢这个手机上"全能名片王"的功能,正好最近攒了一堆名片没有收入到outlook中,可以试试. 一切就绪: 这个功能原来在其他的手机上也用过,但在Windows Mobile 的 ...

  10. 顶级OCR神器:福昕扫描王使用全攻略|装机必备

    如果要把一本书上的文字复制下来, 需要照着书一个一个字打,但是如果通过OCR, 我们就可以通过拍照快速的将这些文字从书本上拷贝出来. 如果要制作扫描件,不需要到处找扫描仪,直接手机拍照通过图像处理曝光 ...

最新文章

  1. Quartz2D初体验(二)
  2. 工控设备 如何将数据发送到串口_嵌入式无风扇工控机在水质监测系统中的应用...
  3. 微信,QQ这类IM app怎么做——谈谈Websocket
  4. Ubuntu Linux系统中出现jupyter notebook不能自动打开浏览器
  5. php工程模式,factory - PHP工程模式如何传入参数
  6. [推举]网络工程师必懂的专业术语
  7. 推荐一个数据可视化网站,提供绘图创意
  8. Keepalived 配置实例
  9. Scala学习02——Scala类和对象
  10. JSON转换和序列化的区别
  11. C语言/C++中strcpy_s函数
  12. scrapy介绍及使用
  13. 【阿里云镜像】使用阿里云Docker CE 镜像安装Docker
  14. Python文件的读写以及操作excel
  15. VS2010 Ultimate 微软官网免费下载 VS2010终级版
  16. 今日头条的新闻推荐算法原理
  17. Windows平台在线安装Qt 6.0.0图文教程
  18. 云台山春花将逝,热情的盛夏等待您
  19. 怎样在群晖中安装GitLab用于项目代码管理
  20. Linux/Centos安装oracle11超详细图文教程

热门文章

  1. Java如何给ServerSocket绑定指定IP地址
  2. MATLAB 2016a安装
  3. mysql sql delete语句_SQL Delete语句
  4. 短信平台API接口集成指南
  5. Linux卸载JDK(虚拟机自带JDK)
  6. 通过网页链接调用QQ临时会话实现
  7. 在群晖NAS上使用Docker 蒲公英
  8. ros 开源物体检测_ROS kinetic + Realsens D435i + ORK + LINEMOD 物体识别
  9. 西门子V90 PN控制FB284块的个人理解
  10. Python 遗传算法路径规划