利用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中使用判断语句和循环的教程
Apr 25 Python
Python3实现Web网页图片下载
Jan 28 Python
Python程序退出方式小结
Dec 09 Python
python基于paramiko将文件上传到服务器代码实现
Jul 08 Python
Python高级特性——详解多维数组切片(Slice)
Nov 26 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
Mar 12 Python
在Django中预防CSRF攻击的操作
Mar 13 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
Python如何使用ElementTree解析xml
Oct 12 Python
python3访问字典里的值实例方法
Nov 18 Python
Python使用openpyxl批量处理数据
Jun 23 Python
python中的sys模块和os模块
Mar 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和ACCESS写聊天室(二)
2006/10/09 PHP
PHP 设计模式之观察者模式介绍
2012/02/22 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
PHP递归获取目录内所有文件的实现方法
2016/11/01 PHP
写给想学习Javascript的朋友一点学习经验小结
2010/11/23 Javascript
js获取图片大小的函数代码
2011/09/20 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
JS实现可缩放、拖动、关闭和最小化的浮动窗口完整实例
2015/03/04 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
Ajax跨域实现代码(后台jsp)
2017/01/21 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
2018/03/21 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python list操作用法总结
2015/11/10 Python
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
2018/05/26 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
python 输出所有大小写字母的方法
2019/01/02 Python
python使用Word2Vec进行情感分析解析
2020/07/31 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
美国Rue La La闪购网站:奢侈品、中高档品牌限时折扣
2016/10/19 全球购物
中软国际Java程序员机试题
2012/08/19 面试题
大学生两会学习心得体会
2014/03/10 职场文书
业务员自荐信范文
2014/04/20 职场文书
舞蹈教育学专业求职信
2014/06/29 职场文书
2014年销售员工作总结
2014/12/01 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
课程设计感想范文
2015/08/11 职场文书
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle