利用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缩进区别分析
Feb 15 Python
Python学习笔记_数据排序方法
May 22 Python
python简单文本处理的方法
Jul 10 Python
Python向日志输出中添加上下文信息
May 24 Python
Python使用ConfigParser模块操作配置文件的方法
Jun 29 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
python学生管理系统学习笔记
Mar 19 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
Python使用指定字符长度切分数据示例
Dec 05 Python
opencv设置采集视频分辨率方式
Dec 10 Python
基于Python数据结构之递归与回溯搜索
Feb 26 Python
Python3爬虫带上cookie的实例代码
Jul 28 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
超级简单的发送邮件程序
2006/10/09 PHP
PHP中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
PHP中使用break跳出多重循环代码实例
2015/01/21 PHP
PHP向socket服务器收发数据的方法
2015/01/24 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
PHP调用其他文件中的类
2018/04/02 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
JS在IE和FF下attachEvent,addEventListener学习笔记
2009/11/26 Javascript
jQuery Dialog 弹出层对话框插件
2010/08/09 Javascript
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
实现js保留小数点后N位的代码
2014/11/13 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
Bootstrap导航条学习使用(二)
2017/02/08 Javascript
详解nodejs中express搭建权限管理系统
2017/09/15 NodeJs
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
nodejs中Express与Koa2对比分析
2018/02/06 NodeJs
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
在vue中使用echarts(折线图的demo,markline用法)
2020/07/20 Javascript
下载给定网页上图片的方法
2014/02/18 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
详解HTML5 Canvas标签及基本使用
2020/01/10 HTML / CSS
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
餐厅采购员岗位职责
2014/03/06 职场文书
2014植树节活动总结
2014/03/11 职场文书
学生违反校规检讨书
2014/10/28 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
自我推荐信怎么写
2015/03/24 职场文书
2015年质检工作总结
2015/05/04 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP
MySQL创建管理RANGE分区
2022/04/13 MySQL