当前位置: 首页 > news >正文

OpenCV-python小玩意11 透视变换

0.什么是透视变换?

透视变换(Perspective Transformation)是计算机视觉中的一项基础技术,它能够将图像从一个视角投影到另一个视角。

用我的大白话来说:透视变换就是让图像"正"起来的技术。比如你斜着拍了一张身份证照片,通过透视变换可以让它变成正面的样子,就像身份证平放在扫描仪上拍的一样。

透视变换的数学本质是一个3x3的变换矩阵,通过这个矩阵可以实现:将倾斜拍摄的平面物体"扶正"、模拟不同视角下的拍摄效果以及消除透视畸变,获得物体的正视图等效果。
今天我们的任务就是 扶正图片:把倾斜拍摄的文档变成正面视图。

1. 用到的函数

1.1 cv2.getPerspectiveTransform

该函数用于计算透视变换矩阵。

函数原型

cv2.getPerspectiveTransform(src,    # 源图像中的四边形顶点坐标dst,    # 目标图像中的对应顶点坐标solveMethod=None  # 求解方法
) -> M     # 返回3x3透视变换矩阵

参数说明

  • src:源图像中四边形顶点的坐标,4x2的numpy数组
  • dst:目标图像中对应顶点的坐标,4x2的numpy数组

返回值

  • 3x3的透视变换矩阵

举个栗子:

import cv2
import numpy as np# 定义源点和目标点
src_points = np.float32([[56,65], [368,52], [389,390], [72,387]])
dst_points = np.float32([[0,0], [300,0], [300,300], [0,300]])# 计算变换矩阵
M = cv2.getPerspectiveTransform(src_points, dst_points)print("变换矩阵:\n", M)

1.2 cv2.warpPerspective

它是OpenCV中用于执行透视变换的核心函数,它能够将图像从一个视角投影到另一个视角。

函数原型

dst = cv2.warpPerspective(src,                 # 输入图像M,                   # 3x3变换矩阵dsize,               # 输出图像尺寸dst=None,            # 输出图像(可选)flags=cv2.INTER_LINEAR, # 插值方法borderMode=cv2.BORDER_CONSTANT, # 边界处理模式borderValue=0        # 边界填充值
)

参数说明

  • src:输入图像
  • M:3x3变换矩阵,通过cv2.getPerspectiveTransform计算或cv2.findHomography计算单应性矩阵
  • dsize:输出图像大小 (width, height)
  • flags:插值方法,默认为INTER_LINEAR
标志说明适用场景
INTER_NEAREST最近邻插值实时性要求高,质量要求低
INTER_LINEAR双线性插值(默认)大多数通用场景
INTER_CUBIC双三次插值高质量放大
INTER_LANCZOS4Lanczos插值最高质量要求
INTER_AREA区域插值图像缩小
  • borderMode:边界像素处理模式,默认为BORDER_CONSTANT
模式说明典型值
BORDER_CONSTANT固定值填充0或(0,0,0)
BORDER_REPLICATE边缘复制-
BORDER_REFLECT镜像反射-
BORDER_WRAP平铺重复-
  • borderValue:边界填充值,默认为0

返回值

  • 变换后的图像

举个栗子:

import cv2
import numpy as np# 读取图像
img = cv2.imread('document.jpg')
h, w = img.shape[:2]# 定义源点和目标点
src_pts = np.float32([[56,65], [368,52], [389,390], [72,387]])
dst_pts = np.float32([[0,0], [w,0], [w,h], [0,h]])# 计算变换矩阵
M = cv2.getPerspectiveTransform(src_pts, dst_pts)# 执行透视变换
result = cv2.warpPerspective(img, M, (w, h))cv2.imshow('Result', result)
cv2.waitKey(0)

2.图像矫正手动示例

2.1 准备图像

首先准备一张倾斜拍摄的图像:

import cv2
import numpy as np# 读取图像
image = cv2.imread('document.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 显示原始图像
cv2.imshow('Original', image)
cv2.waitKey(0)

2.2 手动选择角点

我们需要先找到文档的四个角点,自动检测的角点难度比较大,放到后面研究,这次我们手动选择:

# 创建一个回调函数
points = []
def click_event(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
points.append((x,y))
cv2.circle(image, (x,y), 5, (0,255,0), -1)
cv2.imshow('Image', image)# 显示图像并等待点击
cv2.imshow('Image', image)
cv2.setMouseCallback('Image', click_event)
cv2.waitKey(0)
cv2.destroyAllWindows()# 转换为numpy数组
src_points = np.float32(points[:4])

图片

2.3 计算透视变换矩阵

现在我们有了源图像的四个角点,还需要定义目标图像的四个角点位置:

# 源图像角点
src_points = np.float32(points[:4])# 计算目标图像大小
width = max(np.linalg.norm(src_points[0]-src_points[1]),
np.linalg.norm(src_points[2]-src_points[3]))
height = max(np.linalg.norm(src_points[0]-src_points[3]),
np.linalg.norm(src_points[1]-src_points[2]))# 目标图像角点
dst_points = np.float32([[0,0], [width,0], [width,height], [0,height]])# 计算透视变换矩阵
M = cv2.getPerspectiveTransform(src_points, dst_points)

2.4 执行透视变换

有了变换矩阵,就可以进行实际变换了:

# 执行变换
warped = cv2.warpPerspective(image, M, (int(width), int(height)))# 显示结果
cv2.imshow('Warped', warped)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果图如下:
结果

4.写在最后

今天算是对透视变换有了初步的了解,由浅入深,慢慢进步。
有了透视变换,就可以轻松地把各种倾斜拍摄的文档、标牌、图片"扶正",为后续的处理和分析打下良好基础。
后面等着我们的还有仿射变换。

http://www.dtcms.com/a/545854.html

相关文章:

  • 网站百度快照怎么做tiktok官网版下载
  • 保定seo网络推广南宁网站建设优化服务
  • 算法:滑动窗口类型题目的总结
  • 广告公司宣传语深圳免费网站排名优化
  • zabbix监控
  • 禁用Spring Boot 中邮件健康检查
  • 基于Prometheus和Grafana的MySQL监控,服务器监控
  • 电子商务网站开发流程包括国外域名注册商排名
  • 手机如何做微商城网站设计微信里面如何做网站
  • 大模型-模型压缩:量化、剪枝、蒸馏、二值化 (5)
  • Apollo的inner message和proto message以及同一进程里有多个线程传递两种不同消息数据时可能导致进程崩溃
  • 做响应式网站的菜单栏网上做兼职的网站有哪些
  • 六安seo网站推广报价wordpress蜘蛛插件
  • DDR功能拓展之NVME数据处理
  • 中国建设银行官方网站悦生活长沙专业网站设计
  • Rust——异步递归深度指南:从问题到解决方案
  • 做网站要买什么空间网站创建快捷方式
  • wordpress网站管理系统威海住房和城乡建设局网站首页
  • 8.1.1 大数据方法论与实践指南-埋点需求流程
  • 【实时Linux实战系列】实时Linux项目的文档化与知识传递
  • 电子商务网站开发参考文献购物网站开发的必要性
  • web端 F12 快捷修改请求参数并重发接口
  • 东莞网站建设乐云seo在线制作公众号一键导入wordpress
  • Promise.all和Promise.race的区别
  • 聊城有制作网站的吗甘肃建设厅网站首页
  • 思维类:如何让孩子喜欢阅读
  • 如何编写网站建设销售的心得近10天的时政新闻
  • 百度亮相 SREcon25:搜索稳定背后的秘密,微服务雪崩故障防范
  • 仓颉语言中的MVVM架构实现:响应式数据绑定底层机制深度解析
  • PHP7.4.33 安装sqlsrv扩展