利用Python将图片中扭曲矩形的复原
作者:颹蕭蕭 发布时间:2022-05-24 21:35:54
标签:python,图片,复原
前言
日常生活中,手残党们经常会把一些照片拍歪,比如拍个证件、试卷、PPT什么的,
比如下面这本书的封面原本是个矩形,随手一拍就成了不规则四边形
想要把它变成规则的矩形,有什么办法呢?
你一定想到了 PS,因为网上很多教程就是这么教的
打开PS⟹\Longrightarrow⟹ 滤镜⟹\Longrightarrow⟹镜头校正⟹\Longrightarrow⟹自定⟹\Longrightarrow⟹变换
可是这样手工的调整数值实在是费劲哟!!
下面我们来写个程序,自动将图片恢复到任意矩形!
程序实现
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. 在图片中标记四个角点
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)
结果如下
结果没有想象的完美,是因为书的封面已经不是一个平面了,书角翘起。。。
如果图片中的矩形在一个平面上的话,效果还是挺不错的!!
完整代码下载
可关注后免费下载喔:https://download.csdn.net/download/itnerd/12819535(本地下载)
来源:https://blog.csdn.net/itnerd/article/details/108429553
0
投稿
猜你喜欢
- 1.setting--version control--subversion,按照图中红色字体填入对应信息2.配置中途遇到没找到svn.ex
- 1.sort()方法sort()是列表的方法,修改原列表使得它按照大小排序,没有返回值,返回NoneIn [90]: x = [4, 6,
- 天极网软件频道的图片切换特效,完全是由XHTML+CSS+JS实现的图片切换特效,弄了好半天啊!!如果您使用或者转载请别忘了加我的一个连接啊
- 注:此处“重复”非完全重复,意为某字段数据重复HZT表结构IDintTitlenvarchar(50)AddDatedatetime数据一.
- 有一道算法题题目的意思是在二维数组里找到一个峰值。要求复杂度为n。解题思路是找田字(四边和中间横竖两行)中最大值,用分治法递归下一个象限的田
- 目前为止,我们使用函数时所用的参数都是位置参数,即传入函数的实际参数必须与形式参数的数量和位置对应。而本节将介绍的关键字参数,则可以避免牢记
- 目录1.自动移动鼠标,以便Skype / Lynk显示你在工作中处于活动状态2.使用Selenium自动化网站登录过程3.自动文件备份4.自
- em 和 strong 的区别,可以从三个层次上来谈。首先看 HTML 4.01 中的说明:EM: Indicates emphasis.S
- 一.设置客户端网络实用工具点击“开始”-“程序”,在“Microsoft SQL Server”菜单中选择“客户端网络实用工具”。在“别名”
- 下表列出 SQL Server 查询分析器提供的所有键盘快捷方式。活动 快捷方式 书签:清除所有书签。 CTRL-SHIFT-F2
- 一日,遇到一个问题,求上一个月的今天。 最开始我们使用 strtotime(”-1 month”) 函数求值,发现有一个问题,月长度不一样的
- 好久没写技术相关的文章,这次写篇有意思的,关于一个有意思的游戏——QQ找茬,关于一种有意思的语言——Python,关于一个有意思的库——Qt
- Mysqli是php5之后才有的功能,没有开启扩展的朋友可以打开您的php.ini的配置文件。 查找下面的语句:;extension=php
- ckptfrom tensorflow.python import pywrap_tensorflow checkpoint_path =
- 1. 安装pip install PyExecJS # 需要注意, 包的名称:
- pandas代码如下:import pandas as pdimport numpy as npsalaries = pd.DataFram
- Python中默认安装的ftplib模块定义了FTP类,可用来实现简单的ftp客户端,用于上传或下载文件。ftp登陆连接from ftpli
- 爬虫数据保存到mongoDB的方法:import pymongo# 首先需要注意,mongodb数据库存储的类型是以键值
- 由于初学Django所以对于其特有的表单模板和models中的filefiled并不是特别熟悉。因此在本次开发中还是依照以往自己在html中
- Matplotlib配置了配色方案和默认设置,主要用来准备用于发布的图片。有两种方式可以设置参数,即全局参数定制和rc设置方法。查看matp