利用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 18 Python
python实现简单的socket server实例
Apr 29 Python
在Python中操作列表之List.append()方法的使用
May 20 Python
Python编程生成随机用户名及密码的方法示例
May 05 Python
Python标准库inspect的具体使用方法
Dec 06 Python
python PyTorch参数初始化和Finetune
Feb 11 Python
用TensorFlow实现lasso回归和岭回归算法的示例
May 02 Python
Python决策树之基于信息增益的特征选择示例
Jun 25 Python
python 找出list中最大或者最小几个数的索引方法
Oct 30 Python
Python facenet进行人脸识别测试过程解析
Aug 16 Python
python实现飞机大战小游戏
Nov 08 Python
django创建css文件夹的具体方法
Jul 31 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/06/20 PHP
php牛逼的面试题分享
2013/01/18 PHP
JavaScript类和继承 prototype属性
2010/09/03 Javascript
Javascript模块化编程(一)模块的写法最佳实践
2013/01/17 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
js获取url参数值的两种方式
2013/09/10 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
vue2 中二级路由高亮问题及配置方法
2019/06/10 Javascript
vue draggable resizable gorkys与v-chart使用与总结
2019/09/05 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
[59:26]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第二局
2016/02/28 DOTA
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
2018/02/24 Python
Python编程深度学习绘图库之matplotlib
2018/12/28 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
python自动生成证件号的方法示例
2021/01/14 Python
DAWGS鞋官方网站:鞋,凉鞋,靴子
2016/10/04 全球购物
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
小学生防溺水广播稿
2014/01/12 职场文书
会计电算化个人求职信范文
2014/01/24 职场文书
领导班子作风建设剖析材料
2014/10/11 职场文书
给男朋友的道歉短信
2015/05/12 职场文书
2015年党建工作汇报材料
2015/06/25 职场文书
初一语文教学反思
2016/03/03 职场文书
在HTML5 localStorage中存储对象的示例代码
2021/04/21 Javascript
在JavaScript中如何使用宏详解
2021/05/06 Javascript
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android
MySQL中的隐藏列的具体查看
2021/09/04 MySQL
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript