利用Python将图片中扭曲矩形的复原


Posted in Python onSeptember 07, 2020

前言

日常生活中,手残党们经常会把一些照片拍歪,比如拍个证件、试卷、PPT什么的,

比如下面这本书的封面原本是个矩形,随手一拍就成了不规则四边形

想要把它变成规则的矩形,有什么办法呢?

利用Python将图片中扭曲矩形的复原

你一定想到了 PS,因为网上很多教程就是这么教的

打开PS ⟹\Longrightarrow⟹ 滤镜 ⟹\Longrightarrow⟹镜头校正 ⟹\Longrightarrow⟹自定 ⟹\Longrightarrow⟹变换

可是这样手工的调整数值实在是费劲哟!!

利用Python将图片中扭曲矩形的复原

下面我们来写个程序,自动将图片恢复到任意矩形!

程序实现

1. 打开图片并显示

import cv2 as cv
import numpy as np

path = './book.jpg'
src = cv.imread(path)

def get_window_size(src, bound=600):
 h,w = src.shape[0], src.shape[1]
 if h > w:
  h, w = bound, int(w*bound/h)
 else:
  h, w = int(h*bound/w), bound
 return (h, w)

h, w = get_window_size(src)

win_name = 'RecAdjust'
cv.namedWindow(win_name, cv.WINDOW_NORMAL)
cv.resizeWindow(win_name, width=w, height=h)
cv.imshow(win_name, src)
cv.waitKey(0)
cv.destroyAllWindows()

2. 在图片中标记四个角点

利用Python将图片中扭曲矩形的复原

src_copy = src.copy()

class Indexer:
 def __init__(self, bound=4):
  self.id = 0
  self.bound=bound
 
 def get_id(self):
  self.id = (self.id+1)%self.bound
  return (self.id-1)%self.bound+1

def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
 if event == cv.EVENT_LBUTTONDOWN:
  
  img = param['src']
  win_name = param['window']
  indexer = param['indexer']
  points = param['points']
  
  curr_id = indexer.get_id()
  points.append((x,y))
  print('第{}个顶点: ({},{})'.format(curr_id, x, y))
  
  cv.circle(img, (x, y), 10, (0, 0, 255), thickness = 2)
  cv.putText(
   img,  
   str(curr_id),   # 文字
   (x, y),     # 坐标
   cv.FONT_HERSHEY_PLAIN,
   5,      # 字号
   (0,0,255),    # 字体颜色
   thickness = 2   # 粗细
  )

  cv.imshow(win_name, img)

points = []
indexer = Indexer()
win_name = 'RecAdjust'
cv.namedWindow(win_name, cv.WINDOW_NORMAL)
cv.resizeWindow(win_name, width=w, height=h)
cv.imshow(win_name, src)
cv.setMouseCallback(win_name, on_EVENT_LBUTTONDOWN, param={'src':src,'window':win_name, 'indexer':indexer, 'points':points})
cv.waitKey(0)
cv.destroyAllWindows()
print(points)

3. 设定输出矩形大小

# W = int(input('输出图片宽度:'))
# H = int(input('输出图片高度:'))
W,H = 600, 800
target_points = [(0,0),(W,0),(W,H),(0,H)]

4. 求解透视变换矩阵

points, target_points = np.array(points, dtype=np.float32), np.array(target_points, dtype=np.float32)
M = cv.getPerspectiveTransform(points, target_points)
print('透视变换矩阵:',M)

5. 透视变换并保存图片

result = cv.warpPerspective(src_copy, M, (0, 0))
result = result[:H, :W]
win_name = 'Result'
cv.namedWindow(win_name, cv.WINDOW_NORMAL)
cv.resizeWindow(win_name, width=W, height=H)
cv.imshow(win_name, result)
cv.waitKey(0)
cv.destroyAllWindows()

output_file = 'result.jpg'
cv.imwrite(output_file, result)

结果如下

利用Python将图片中扭曲矩形的复原

结果没有想象的完美,是因为书的封面已经不是一个平面了,书角翘起。。。

如果图片中的矩形在一个平面上的话,效果还是挺不错的!!

利用Python将图片中扭曲矩形的复原

完整代码下载

可关注后免费下载喔:https://download.csdn.net/download/itnerd/12819535(本地下载)

总结

到此这篇关于利用Python将图片中扭曲矩形复原的文章就介绍到这了,更多相关Python图片扭曲矩形复原内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
解密Python中的描述符(descriptor)
Jun 03 Python
Python聚类算法之DBSACN实例分析
Nov 20 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
Jun 02 Python
Python使用pylab库实现绘制直方图功能示例
Jun 01 Python
Python定义一个跨越多行的字符串的多种方法小结
Jul 19 Python
Python根据当前日期取去年同星期日期
Apr 14 Python
Python基于机器学习方法实现的电影推荐系统实例详解
Jun 25 Python
Python-copy()与deepcopy()区别详解
Jul 12 Python
对Python _取log的几种方式小结
Jul 25 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
Python 如何在字符串中插入变量
Aug 01 Python
如何快速一次性卸载所有python包(第三方库)呢
Oct 20 Python
python利用递归方法实现求集合的幂集
Sep 07 #Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 #Python
python简单利用字典破解zip文件口令
Sep 07 #Python
python 如何快速复制序列
Sep 07 #Python
Python2与Python3关于字符串编码处理的差别总结
Sep 07 #Python
python 装饰器的实际作用有哪些
Sep 07 #Python
通俗讲解python 装饰器
Sep 07 #Python
You might like
php+mysql开源XNA 聚合程序发布 下载
2007/07/13 PHP
PHP 开源AJAX框架14种
2009/08/24 PHP
Cookie跨域问题解决方案代码示例
2020/11/24 PHP
IE8 下的Js错误HTML Parsing Error...
2009/08/14 Javascript
JavaScript OOP面向对象介绍
2010/12/02 Javascript
js中将URL中的参数提取出来作为对象的实现代码
2011/08/16 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
浅析JavaScript中的同名标识符优先级
2013/12/06 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
JavaScript实现数组随机排序的方法
2015/06/26 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
JS实现上传图片实时预览功能
2017/05/22 Javascript
JS作用域链详解
2017/06/26 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
2018/11/28 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
JS隐藏号码中间4位代码实例
2019/04/09 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python判断两个对象相等的原理
2017/12/12 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
python系列 文件操作的代码
2019/10/06 Python
浅谈Python访问MySQL的正确姿势
2020/01/07 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
优秀志愿者事迹材料
2014/02/03 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
军训自我鉴定范文
2014/02/13 职场文书
教师自我鉴定范文
2014/03/20 职场文书
给学校建议书范文
2014/05/13 职场文书
学校党的群众路线教育实践活动对照检查材料
2014/09/24 职场文书
公积金接收函格式
2015/01/30 职场文书
幼儿园万圣节活动总结
2015/05/05 职场文书
婚礼父母致辞
2015/07/28 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python