利用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 文件和输入输出小结
Oct 09 Python
Python函数中的函数(闭包)用法实例
Mar 15 Python
unittest+coverage单元测试代码覆盖操作实例详解
Apr 04 Python
python 获取当天凌晨零点的时间戳方法
May 22 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
python3使用腾讯企业邮箱发送邮件的实例
Jun 28 Python
pytorch实现保证每次运行使用的随机数都相同
Feb 20 Python
django template实现定义临时变量,自定义赋值、自增实例
Jul 12 Python
python 制作简单的音乐播放器
Nov 25 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
Jan 05 Python
python之基数排序的实现
Jul 26 Python
如何在python中实现ECDSA你知道吗
Nov 23 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
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
深入PHP curl参数的详解
2013/06/17 PHP
PHP实用小技巧之调用录像的方法
2019/12/05 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
javascript读取xml
2006/11/04 Javascript
Js callBack 返回前一页的js方法
2008/11/30 Javascript
Jquery事件的连接使用示例
2013/06/18 Javascript
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
DIV+CSS+jQ实现省市联动可扩展
2016/06/22 Javascript
AngularJS服务service用法总结
2016/12/13 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
js实现股票实时刷新数据案例
2017/05/14 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
实例讲解Vue.js中router传参
2018/04/22 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
更强大的vue ssr实现预取数据的方式
2019/07/19 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
ES6中Promise的使用方法实例总结
2020/02/18 Javascript
koa-passport实现本地验证的方法示例
2020/02/20 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
Python3多线程版TCP端口扫描器
2019/08/31 Python
佳能德国网上商店:Canon德国
2017/03/18 全球购物
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
英语感恩演讲稿
2014/01/14 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
秋季开学典礼主持词
2014/03/19 职场文书
合作协议书怎么写
2014/04/18 职场文书
货物运输服务质量承诺书
2014/05/29 职场文书
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python
MySql数据库触发器使用教程
2022/06/01 MySQL