日常生活中,手残党们经常会把一些照片拍歪,比如拍个证件、试卷、PPT什么的,

比如下面这本书的封面原本是个矩形,随手一拍就成了不规则四边形

想要把它变成规则的矩形,有什么办法呢?


你一定想到了 PS,因为网上很多教程就是这么教的

打开PS ⟹\Longrightarrow⟹ 滤镜 ⟹\Longrightarrow⟹镜头校正 ⟹\Longrightarrow⟹自定 ⟹\Longrightarrow⟹变换

可是这样手工的调整数值实在是费劲哟!!


下面我们来写个程序,自动将图片恢复到任意矩形!

程序实现

1. 打开图片并显示

import cv2 as cv
import numpy as nppath = './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), boundreturn (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 = 0self.bound=bounddef get_id(self):self.id = (self.id+1)%self.boundreturn (self.id-1)%self.bound+1def 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

Python 图片中扭曲矩形的复原相关推荐

  1. Python opencv进行矩形识别

    Python opencv进行矩形识别 图像识别中,圆形和矩形识别是最常用的两种,上一篇讲解了圆形识别,本例讲解矩形识别,最后的结果是可以识别出圆心,4个顶点,如下图: 左边是原始图像,右边是识别结果 ...

  2. 利用OpenCV从图片中提取矩形并标注坐标(室内平面地图)——(一)

    某城市会展中心室内地图 背景 一名室内设计师的日常工作从设计一张会展地图开始.常常有这样的场景:划分除规范的展位后,进入销售阶段,频繁的需要修改这张地图,如展示拆分.合并.换位置.标记已交易. 问题 ...

  3. python代码计算矩形面积_学习资料Python语言基础知识笔记以及答案

    01. Python语言基础知识等笔记: 02. Python作业答案: [例2-3]通过输入函数input()输入股票代码.股票名称.当天股票最高价和最低价,通过输出函数print()输出股票代码+ ...

  4. opencv获取图片像素坐标_利用OpenCV从图片中提取矩形并标注坐标(室内平面地图)(一)

    ​某城市会展中心室内地图 背景 一名室内设计师的日常工作从设计一张会展地图开始.常常有这样的场景:划分除规范的展位后,进入销售阶段,频繁的需要修改这张地图,如展示拆分.合并.换位置.标记已交易. 问题 ...

  5. Python OpenCV 实现魔方识别+复原

    简介 本项目运用了基础的 Opencv 图像处理算法 来实现魔方色块的识别并判断颜色. 用户可以通过将魔方举在摄像机的前方来让机器自动将魔方的色块录入数据,然后系统将会依靠用户录入的数据来产生当前魔方 ...

  6. python 最小外接矩形笔记

    目录 opencv生成最小外接矩形: 最小外接矩形修正版: opencv生成最小外接矩形: cnt = np.array([[x1,y1],[x2,y2],[x3,y3],[x4,y4]]) # 必须 ...

  7. Python - 寻找最大矩形 数字版矩阵版

    一.引言 给定一个仅包含 0 和 1 .大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 例如给定如上 4 x 5 的 0-1 矩阵,由1组成的最大矩形面积 ...

  8. python定义一个矩形类_创建矩形类

    你的class有一些问题.见以下评论class Rectangle: # Init function def __init__(self): # The only members are length ...

  9. python代码计算矩形面积_Python面积计算器源代码

    本程序通过一个while循环分两步计算图形面积,首先确认图形形状,然后根据不同的图形采用不同的面积公式进行计算,目前可支持矩形.正方形.三角形.梯形.圆形. 感兴趣的朋友还可以添加其它图形面积计算,也 ...

最新文章

  1. Windows——FTP命令匿名登录解决方案
  2. CaffeMFC:caffe.pb.h(2525): error C2059: syntax error : 'constant'
  3. Github Pages建立个人博客
  4. Python基础知识(四)--函数
  5. 干掉 SQL 中的 like,我用 es 后运营小姐姐们都说好快!
  6. 淘宝天猫1688以图搜图,按图搜索商品,API接口调用展示(拍立淘API)
  7. 将A3排版的PDF内容转成A4纸张
  8. python绘制彩色地震剖面断层解释_地震剖面上的断层分析及相关意义
  9. SpringCloud原理分析
  10. select vba 网页 翻页_通过VBA程序来实现Excel表格翻页的方法
  11. 马悦凌:从初级护士到“民间奇医”[2]
  12. 从入门到进阶,Python程序员必看的6本书籍!
  13. WOSADO悦瞳获近3亿人民币融资;研卤堂获数千万人民币A轮融资
  14. 1960-2019年世界银行各国制造业增加值
  15. 进程的攻与“防” ---- 进程隐藏(Win7 x32 绕过PC Hunter)
  16. 蓝桥杯单片机学习过程记录(二十九)第八届国赛超声波测距机
  17. 《动手学深度学习(Dive into Deeplearning)》(第二版)——第二章 _2.3 线性代数
  18. Android中android:digits限制无效原因
  19. 查询office激活所剩时间
  20. android java kindle_Kindle和Android开发的比较:Java实现

热门文章

  1. Revit中柱与梁不能连接问题和“柱断墙梁”功能介绍
  2. 【Y忍冬草】Qt5.8_VTK7.0_VS2015编译配置及测试中问题
  3. S32K3定时器(STMPIT)使用——基于MCAL
  4. 高效制作动画-Adobe Animate CC
  5. IntelliJ IDEA 常用快捷键 之 Windows 版
  6. 自动驾驶(二十一)---------Mobileye单目测距
  7. 【STM32F407 开发板】实验六 :SysTick 系统滴答实验
  8. WinEdt编译完成后无法预览pdf、pdf图标是灰色的、系统找不到文件解决方法
  9. JS判断是否是JSON数据
  10. 社群管理4大必备工具,助你高效管理