利用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 30 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
Python2.7编程中SQLite3基本操作方法示例
Aug 09 Python
PyCharm代码格式调整方法
May 23 Python
python操作日志的封装方法(两种方法)
May 23 Python
Python 离线工作环境搭建的方法步骤
Jul 29 Python
深入学习python多线程与GIL
Aug 26 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
Dec 22 Python
Python虚拟环境的创建和包下载过程分析
Jun 19 Python
Python多分支if语句的使用
Sep 03 Python
python批量更改目录名/文件名的方法
Apr 18 Python
Python实现Excel文件的合并(以新冠疫情数据为例)
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
linux下使用ThinkPHP需要注意大小写导致的问题
2011/08/02 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
js css后面所带参数含义介绍
2013/08/18 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
javascript实现控制div颜色
2015/07/07 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
关于 jQuery Easyui异步加载tree的问题解析
2016/12/06 Javascript
javascript中递归的两种写法
2017/01/17 Javascript
JS设置CSS样式的方式汇总
2017/01/21 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
2017/02/24 Javascript
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
vue增加强缓存和版本号的实现方法
2019/05/01 Javascript
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
js+for循环实现字符串自动转义的代码(把后面的字符替换前面的字符)
2020/12/24 Javascript
Python中optionParser模块的使用方法实例教程
2014/08/29 Python
Python进行数据提取的方法总结
2016/08/22 Python
用Python设计一个经典小游戏
2017/05/15 Python
Django自定义用户认证示例详解
2018/03/14 Python
python处理csv中的空值方法
2018/06/22 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
2019/10/14 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
大型车展策划方案
2014/02/01 职场文书
2014年会策划方案
2014/05/11 职场文书
湖南省召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
经营目标责任书
2015/05/08 职场文书
2015年电厂工作总结范文
2015/05/13 职场文书
借款民事起诉状范文
2015/05/19 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
Pygame Draw绘图函数的具体使用
2021/11/17 Python
世界十大评分最高的动漫,CLANNAD上榜,第八赚足人们眼泪
2022/03/18 日漫