利用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实现基于权重的随机数2种方法
Apr 28 Python
使用Python的urllib和urllib2模块制作爬虫的实例教程
Jan 20 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
Feb 08 Python
JavaScript中的模拟事件和自定义事件实例分析
Jul 27 Python
python 文件查找及内容匹配方法
Oct 25 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
Jul 11 Python
在python中计算ssim的方法(与Matlab结果一致)
Dec 19 Python
Python2和Python3中@abstractmethod使用方法
Feb 04 Python
大数据分析用java还是Python
Jul 06 Python
Python爬虫破解登陆哔哩哔哩的方法
Nov 17 Python
python多线程和多进程关系详解
Dec 14 Python
Python爬虫开发与项目实战
Dec 16 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 mssql 日期出现中文字符的解决方法
2009/03/10 PHP
Nigma vs Alliance BO5 第五场2.14
2021/03/10 DOTA
IE和Firefox下event事件杂谈
2009/12/18 Javascript
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
javascript从右边截取指定字符串的三种实现方法
2013/11/29 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
2015/11/24 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
JavaScript手机振动API
2016/06/11 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
2016/06/30 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
如何从0开始用node写一个自己的命令行程序
2018/12/29 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
2020/03/23 Javascript
Vue+Java 通过websocket实现服务器与客户端双向通信操作
2020/09/22 Javascript
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
python使用zip将list转为json的方法
2018/12/31 Python
Django为窗体加上防机器人的验证码功能过程解析
2019/08/14 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
python Yaml、Json、Dict之间的转化
2020/10/19 Python
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
大学生毕业自我鉴定
2013/11/06 职场文书
社会实践自我鉴定
2013/11/07 职场文书
市场安全管理制度
2014/01/26 职场文书
师范生见习报告
2014/10/31 职场文书
幼儿教师年度个人总结
2015/02/05 职场文书
2015年社区平安建设工作总结
2015/05/13 职场文书
python实现Nao机器人的单目测距
2021/09/04 Python