利用Python将图片中扭曲矩形的复原

作者:颹蕭蕭 时间:2022-05-24 21:35:54 

前言

日常生活中,手残党们经常会把一些照片拍歪,比如拍个证件、试卷、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(本地下载)

来源:https://blog.csdn.net/itnerd/article/details/108429553

标签:python,图片,复原
0
投稿

猜你喜欢

  • MySQL数据库root权限丢失解决方案

    2008-07-13 13:59:00
  • selenium+python截图不成功的解决方法

    2021-06-02 23:25:06
  • python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法

    2021-09-15 16:28:22
  • django celery redis使用具体实践

    2022-12-03 02:45:39
  • Python使用mmap实现内存映射文件操作

    2022-04-26 14:37:19
  • Python+pytorch实现天气识别

    2021-09-23 18:49:13
  • python pip如何手动安装二进制包

    2023-07-24 04:09:14
  • asp 使用正则表达式替换word中的标签,转为纯文本

    2011-02-28 10:49:00
  • python连接池实现示例程序

    2022-04-30 21:59:54
  • Python HTMLParser模块解析html获取url实例

    2023-08-18 01:09:47
  • Python爬取三国演义的实现方法

    2022-12-11 20:07:37
  • JS通过FSO将unicode字符写入文本

    2009-06-01 12:26:00
  • python中matplotlib实现随鼠标滑动自动标注代码

    2023-09-02 10:49:47
  • Collatz 序列、逗号代码、字符图网格实例

    2023-07-27 10:24:31
  • Django REST Framework 分页(Pagination)详解

    2022-07-25 04:21:06
  • 详解Python中heapq模块的用法

    2022-01-15 05:58:35
  • Keras自定义实现带masking的meanpooling层方式

    2021-06-23 03:29:47
  • Python解释执行原理分析

    2022-12-13 22:11:54
  • Python input函数使用实例解析

    2022-01-05 21:00:34
  • python初学之用户登录的实现过程(实例讲解)

    2023-03-16 17:27:37
  • asp之家 网络编程 m.aspxhome.com