利用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的词法分析与语法分析
May 18 Python
Python随机读取文件实现实例
May 25 Python
Python RabbitMQ消息队列实现rpc
May 30 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
Sep 11 Python
wxpython布局的实现方法
Nov 01 Python
学Python 3的理由和必要性
Nov 19 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
Feb 27 Python
Python库skimage绘制二值图像代码实例
Apr 10 Python
python使用OpenCV模块实现图像的融合示例代码
Apr 10 Python
Python用来做Web开发的优势有哪些
Aug 05 Python
利用python绘制中国地图(含省界、河流等)
Sep 21 Python
python中Pexpect的工作流程实例讲解
Mar 02 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源代码
2009/08/21 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
JavaScript 学习历程和心得分享
2010/12/12 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
AspNet中使用JQuery上传插件Uploadify详解
2015/05/20 Javascript
深入理解jQuery之事件移除
2016/06/02 Javascript
jQuery模仿京东/天猫商品左侧分类导航菜单效果
2016/06/29 Javascript
Vue.js 表单校验插件
2016/08/14 Javascript
DOM 事件的深入浅出(一)
2016/12/05 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
jquery实现楼层滚动效果
2018/01/01 jQuery
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
2018/04/13 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
2019/04/02 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
2019/05/03 Javascript
百度小程序自定义通用toast组件
2019/07/17 Javascript
JavaScript this关键字的深入详解
2021/01/14 Javascript
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
Python简单操作sqlite3的方法示例
2017/03/22 Python
安装python3的时候就是输入python3死活没有反应的解决方法
2018/01/24 Python
Python异常处理操作实例详解
2018/08/28 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
python实现nao机器人手臂动作控制
2019/04/29 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
用python实现一个简单的验证码
2020/12/09 Python
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
AURALog面试题软件测试方面
2013/10/22 面试题
全民健身日活动方案
2014/01/29 职场文书
医学生自我鉴定范文
2014/03/26 职场文书
房屋转让协议书
2014/10/18 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书