利用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爬虫抓取手机APP的传输数据
Jan 22 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
Jun 09 Python
python thrift搭建服务端和客户端测试程序
Jan 17 Python
python获取中文字符串长度的方法
Nov 14 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
Dec 05 Python
pytorch:model.train和model.eval用法及区别详解
Feb 20 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
Apr 08 Python
python异常处理之try finally不报错的原因
May 18 Python
python集合的新增元素方法整理
Dec 07 Python
使用pandas实现筛选出指定列值所对应的行
Dec 13 Python
举例讲解Python装饰器
Dec 24 Python
python多次执行绘制条形图
Apr 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中Date()时间日期函数的使用方法小结
2011/04/20 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
PHP文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
php实现随机生成易于记忆的密码
2015/06/19 PHP
Yii针对添加行的增删改查操作示例
2016/10/18 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
2018/07/17 PHP
Javascript将string类型转换int类型
2010/12/09 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
30分钟就入门的正则表达式基础教程
2013/02/25 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
详细解读JavaScript的跨浏览器事件处理
2015/08/12 Javascript
JavaScript知识点总结(四)之逻辑OR运算符详解
2016/05/31 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
Python3基础之基本数据类型概述
2014/08/13 Python
跟老齐学Python之做一个小游戏
2014/09/28 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
Python win32com 操作Exce的l简单方法(必看)
2017/05/25 Python
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
Python矩阵常见运算操作实例总结
2017/09/29 Python
Python设计模式之职责链模式原理与用法实例分析
2019/01/11 Python
python实现可逆简单的加密算法
2019/03/22 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
Python实现中值滤波去噪方式
2019/12/18 Python
python神经网络编程实现手写数字识别
2020/05/27 Python
Python中如何引入第三方模块
2020/05/27 Python
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
eharmony澳大利亚:网上约会服务
2020/02/29 全球购物
港湾网络笔试题
2014/04/19 面试题
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
高中的职业生涯规划书
2013/12/28 职场文书
制药工程专业个人求职自荐信
2014/01/25 职场文书
详解nodejs内置模块
2021/05/06 NodeJs
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python