opencv——图片矫正

news2024/12/13 15:06:24

图像矫正

图像矫正的原理是透视变换,下面来介绍一下透视变换的概念。

听名字有点熟,我们在图像旋转里接触过仿射变换,知道仿射变换是把一个二维坐标系转换到另一个二维坐标系的过程,转换过程坐标点的相对位置和属性不发生变换,是一个线性变换,该过程只发生旋转和平移过程。因此,一个平行四边形经过仿射变换后还是一个平行四边形。

而透视变换是把一个图像投影到一个新的视平面的过程,在现实世界中,我们观察到的物体在视觉上会受到透视效果的影响,即远处的物体看起来会比近处的物体小。透视投影是指将三维空间中的物体投影到二维平面上的过程,这个过程会导致物体在图像中出现形变和透视畸变。透视变换可以通过数学模型来校正这种透视畸变,使得图像中的物体看起来更符合我们的直观感受。通俗的讲,透视变换的作用其实就是改变一下图像里的目标物体的被观察的视角。

 

其中x、y是原始图像点的坐标,$x^{\prime}$、$y^{\prime}$是变换后的坐标,a11,a12,…,a33则是一些旋转量和平移量,由于透视变换矩阵的推导涉及三维的转换,所以这里不具体研究该矩阵,只要会使用就行,而OpenCV里也提供了getPerspectiveTransform()函数用来生成该3*3的透视变换矩阵。

例如:

  

cv2.getPerspectiveTransform(src, dst)

功能:cv2.getPerspectiveTransform(src, dst)

参数:

src: 源图像中的四个点,通常是一个形状为 (4, 2) 的 numpy 数组或类似的数据结构,表示四个点的坐标。这四个点应该按照某种顺序排列(例如,顺时针或逆时针),因为变换矩阵的计算依赖于这个顺序。

dst: 目标图像中的四个点,与 src 参数类似,也是一个形状为 (4, 2) 的 numpy 数组或类似的数据结构,表示变换后四个点应该位于的位置。

函数返回一个 3x3 的变换矩阵,可以使用 cv2.warpPerspective() 函数将这个矩阵应用于图像,从而执行透视变换。

cv2.warpPerspective(src, M, dsize, dst=None, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=None)

功能:用于对图像进行透视变换的函数

参数:

src: 输入图像,即你想要进行透视变换的源图像。

M: 透视变换矩阵,通常是一个 3x3 的矩阵,可以通过 cv2.getPerspectiveTransform() 函数计算得到。这个矩阵定义了源图像中的点如何映射到目标图像中的点。

dsize: 输出图像的尺寸,以 (width, height) 的形式表示。这是变换后图像的尺寸。

dst: 输出图像,这是一个可选参数。

flags: 插值方法。

borderMode: 边界填充方法。

borderValue: 边界颜色【可选】。

import cv2
import numpy as np

img = cv2.imread('../1iamge/test3.jpg')

points1 = np.float32([[420,155],[787,314],[12,522],[412,741]])
points2 = np.float32([[min(points1[:,0]),min(points1[:,1])],
                      [max(points1[:,0]),min(points1[:,1])],
                      [min(points1[:,0]),max(points1[:,1])],
                      [max(points1[:,0]),max(points1[:,1])],
                      ])
M = cv2.getPerspectiveTransform(points1,points2)
img_warp = cv2.warpPerspective(img,M,(img.shape[1],img.shape[0]))
cv2.imshow('img',img)
cv2.imshow('img_warp',img_warp)
cv2.waitKey(0)

原图: 

效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2258836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态流程图制作方法

动态流程图制作方法 1.方法1 有各种 echars模板 可以自己改代码 https://www.isqqw.com/viewer?id42201echars 在线生成 https://codevtool.com/echarts2. 方法2电脑软件,画图的。 《亿图图示》

H.323音视频协议

概述 H.323是国际电信联盟(ITU)的一个标准协议栈,该协议栈是一个有机的整体,根据功能可以将其分为四类协议,也就是说该协议从系统的总体框架(H.323)、视频编解码(H.263)、…

java八股-索引下推(图解对比)

参考链接 https://xiaolincoding.com/mysql/base/how_select.html#%E6%89%A7%E8%A1%8C%E5%99%A8 https://javaguide.cn/database/mysql/mysql-index.html#%E7%B4%A2%E5%BC%95%E4%B8%8B%E6%8E%A8 如何理解索引下推这个概念,其实就是index把Server层的工作&#xff0…

在 Ubuntu 中 make 是否是系统自带的?怎么样查看Linux系统中是否有make?

make 命令 并不是所有 Ubuntu 系统都默认安装的,但它通常是开发工具链的一部分,许多开发者会在安装系统后配置它。make 是一个非常重要的构建工具,用于自动化编译和构建过程,特别是在编译软件或内核时。 make 的来源 make 是一个…

Android系统(android app和系统架构)

文章目录 AndroidAndroid Apps四大组件 Android系统Platform API之下:一个微笑内核adb(Android Debug Bridge) Android包管理机制Android的Intent机制参考 Android LinuxFrameworkJVM 在Linux/Java上做了个二次开发?并不完全是:Android定义…

opencv——识别图片颜色并绘制轮廓

图像边缘检测 本实验要用到Canny算法,Canny边缘检测方法常被誉为边缘检测的最优方法。 首先,Canny算法的输入端应为图像的二值化结果,接收到二值化图像后,需要按照如下步骤进行: 高斯滤波。计算图像的梯度和方向。非极…

【Java笔记】LinkedList 底层结构

一、LinkedList 的全面说明 LinkedList底层实现了双向链表和双端队列特点可以添加任意元素(元素可以重复),包括null线程不安全,没有实现同步 二、LinkedList 的底层操作机制 三、LinkedList的增删改查案例 public class LinkedListCRUD { public stati…

(笔记)解决select下拉框默认选中selected属性不起作用问题

在 vue3 中使用 HTML原生开发,想给 select 下拉框选中 selected 属性不起作用。这是因为 vue3中使用了 Composition API(组合式 api),而 Composition API 中的响应式数据是独立的,不会自动更新到 DOM 中。可以使用 v-m…

国科大智能设备安全-APK逆向分析实验

APK逆向分析实验 使用APK常用逆向分析工具,对提供的移动应用程序APK文件进行逆向分析,提交逆向后代码和分析报告。具体任务如下: 任务一:安装并熟悉Apktool、Jadx等APK常用逆向工具的使用方法,对提供的Facebook Updat…

黑皮书-计算机科学导论02

目录 第二部分:计算机硬件 第5章计算机组成 5.1中央处理单元 Ⅰ.算数逻辑单元 Ⅱ.控制单元 Ⅲ.寄存器 5.2主存储器 Ⅰ.随机存取存储器(RAM) Ⅱ.只读存储器(ROM) 高速缓冲存储器(Cache) 5.3输入/输出子系统 Ⅰ.非存储设备 Ⅱ.存储设备(辅助存…

解决Linux安装yum时出现apt-get install E: 无法定位软件包问题

ubuntu系统安装mysql之前安装yum,出现报错:E: 无法定位软件包问题 (1)找到源镜像,备份 cd /etc/apt/ // 切换到/etc/apt/ 目录下 sudo cp sources.list sources.list.old // 先把源文件…

[工具升级问题] 钉钉(linux版)升级带来的小麻烦

本文由Markdown语法编辑器编辑完成。 1. 背景: 今日钉钉又发布了新的升级版本。由于我工作时使用的是Ubuntu 20.04版本,收到的升级推送信息是,可以升级到最新的7.6.25-Release版本。根据钉钉官方给出的历次更新版说明,这个新的版本&#xf…

UnityShaderLab 实现黑白着色器效果

实现思路:取屏幕像素的RGB值,将三个通道的值相加,除以一个大于值使颜色值在0-1内,再乘上一个强度值调节黑白强度。 在URP中实现需要开启Opaque Texture ShaderGraph实现: ShaderLab实现: Shader "Bl…

python学习笔记—8—数字精度控制

1. %m.nd %m.nf score 100 print("socre %5d"% score) salary 6.66 print("salary %4.2f" % salary)

TMGM平台怎么样?全面解析TMGM

在选择多资产交易平台时,投资者需要综合考虑多个因素,包括平台的安全性、交易条件、客户服务等。TMGM(TradeMax Global Markets)作为一家成立于2013年的平台,在外汇、股指、商品、加密货币等多个市场领域提供交易服务。…

Spring Boot 配置多数据源并手动配置事务

Spring Boot 配置多数据源并手动配置事务 一、为什么多数据源需要手动配置?二、配置多数据源1. 数据源配置类 (DataSourceConfig)2. 主数据库 MyBatis 配置类 (PrimaryDbMyBatisConfig)3. 从数据库 MyBatis 配置类 (SecondaryDbMyBatisConfig)4. application.yml 配…

微积分复习笔记 Calculus Volume 2 - 3.6 Numerical Integration

3.6 Numerical Integration - Calculus Volume 2 | OpenStax

axios请求之参数拼接

URL 查询参数传递数据 优点: 简洁性: URL 查询参数的方式比较简洁,适合传递少量的数据。缓存友好: 查询参数可以被浏览器缓存,适合 GET 请求,但对于 POST 请求,浏览器通常不会缓存。 缺点: 数据大小限制: U…

使用硬约束的物理信息神经网络(PINNs,Physics-Informed Neural Networks)求解一维泊松方程

背景 一维泊松方程定义为: u ′ ′ ( x ) f ( x ) u(x) f(x) u′′(x)f(x),边界条件为 x 0 x0 x0 和 x 1 x1 x1 处, u ( x ) 0 u(x) 0 u(x)0,其中, f ( x ) − π 2 sin ⁡ ( π x ) f(x) -\pi^2 \sin(\pi …

基于单片机的多功能函数信号发生器的设计(论文+源码)

系统总体设计思路 在本次课题为信号发生器,其系统整体架构如图2.1所示,在硬件结构上,其主要包括核心控制器AT89C51单片机,液晶显示器LCD1602,数模转换器DAC0832,运算放大器L358以及按键、LED指示灯等器件,…