图像的透视变换

这篇具有很好参考价值的文章主要介绍了图像的透视变换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

透视变换是一种图像变换技术,用于将图像投影到新的视平面上。它可以通过对图像进行透视、旋转、缩放和扭曲等操作,从而改变图像的视角和形状。在OpenCV中,我们可以使用cv2.warpPerspective函数来实现透视变换操作。

透视变换的原理是基于透视几何学的原理。给定原始图像中的四个非共线点和目标图像中对应的四个点,可以通过计算透视变换矩阵来建立两个平面之间的对应关系。透视变换矩阵是一个3x3的矩阵,它可以通过cv2.getPerspectiveTransform函数计算得到。当进行透视变换时,我们需要计算一个3x3的透视变换矩阵H。该矩阵可以通过给定的四对点的对应关系来计算。假设原始图像中的四个点为 A、B、C和D,对应的目标图像中的四个点为 A’、B’、C’和D’。
我们可以将原始图像中的点表示为齐次坐标形式:
A = [ x A y A 1 ] , B = [ x B y B 1 ] , C = [ x C y C 1 ] , D = [ x D y D 1 ] \begin{gathered} \mathbf{A} = \begin{bmatrix} x_A \\ y_A \\ 1 \end{bmatrix}, \quad \mathbf{B} = \begin{bmatrix} x_B \\ y_B \\ 1 \end{bmatrix}, \quad \mathbf{C} = \begin{bmatrix} x_C \\ y_C \\ 1 \end{bmatrix}, \quad \mathbf{D} = \begin{bmatrix} x_D \\ y_D \\ 1 \end{bmatrix} \end{gathered} A= xAyA1 ,B= xByB1 ,C= xCyC1 ,D= xDyD1
同样,目标图像中的点也可以表示为齐次坐标形式:
A ′ = [ x A ′ y A ′ 1 ] , B ′ = [ x B ′ y B ′ 1 ] , C ′ = [ x C ′ y C ′ 1 ] , D ′ = [ x D ′ y D ′ 1 ] \begin{gathered} \mathbf{A'} = \begin{bmatrix} x_A' \\ y_A' \\ 1 \end{bmatrix}, \quad \mathbf{B'} = \begin{bmatrix} x_B' \\ y_B' \\ 1 \end{bmatrix}, \quad \mathbf{C'} = \begin{bmatrix} x_C' \\ y_C' \\ 1 \end{bmatrix}, \quad \mathbf{D'} = \begin{bmatrix} x_D' \\ y_D' \\ 1 \end{bmatrix} \end{gathered} A= xAyA1 ,B= xByB1 ,C= xCyC1 ,D= xDyD1
透视变换的目标是找到一个3x3的矩阵H,使得:
A ′ = H ⋅ A , B ′ = H ⋅ B , C ′ = H ⋅ C , D ′ = H ⋅ D \begin{gathered} \mathbf{A'} = H \cdot \mathbf{A}, \quad \mathbf{B'} = H \cdot \mathbf{B}, \quad \mathbf{C'} = H \cdot \mathbf{C}, \quad \mathbf{D'} = H \cdot \mathbf{D} \end{gathered} A=HA,B=HB,C=HC,D=HD
展开上述等式,可以得到以下形式:
[ x A ′ y A ′ 1 ] = [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] [ x A y A 1 ] \begin{gathered} \begin{bmatrix} x_A' \\ y_A' \\ 1 \end{bmatrix} = \begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{bmatrix} \begin{bmatrix} x_A \\ y_A \\ 1 \end{bmatrix} \end{gathered} xAyA1 = h11h21h31h12h22h32h13h23h33 xAyA1
[ x B ′ y B ′ 1 ] = [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] [ x B y B 1 ] \begin{gathered} \begin{bmatrix} x_B' \\ y_B' \\ 1 \end{bmatrix} = \begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{bmatrix} \begin{bmatrix} x_B \\ y_B \\ 1 \end{bmatrix} \end{gathered} xByB1 = h11h21h31h12h22h32h13h23h33 xByB1
[ x C ′ y C ′ 1 ] = [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] [ x C y C 1 ] \begin{gathered} \begin{bmatrix} x_C' \\ y_C' \\ 1 \end{bmatrix} = \begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{bmatrix} \begin{bmatrix} x_C \\ y_C \\ 1 \end{bmatrix} \end{gathered} xCyC1 = h11h21h31h12h22h32h13h23h33 xCyC1
[ x D ′ y D ′ 1 ] = [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] [ x D y D 1 ] \begin{gathered} \begin{bmatrix} x_D' \\ y_D' \\ 1 \end{bmatrix} = \begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{bmatrix} \begin{bmatrix} x_D \\ y_D \\ 1 \end{bmatrix} \end{gathered} xDyD1 = h11h21h31h12h22h32h13h23h33 xDyD1
通过这些等式,我们可以得到透视变换矩阵H的形式:
H = [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] \begin{gathered} H = \begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{bmatrix} \end{gathered} H= h11h21h31h12h22h32h13h23h33
为了求解矩阵H,我们需要至少四对点的对应关系。然后,可以使用线性方程求解技术,例如最小二乘法,来求解矩阵H的值。

透视变换在计算机视觉和图像处理中有广泛的应用。它可以用于纠正图像的透视畸变,如校正斜视图像、纠正摄像头畸变等。它还可以应用于图像拼接、目标检测和跟踪、虚拟现实等领域。

透视变换的意义在于可以改变图像的视角和形状,使得图像在新的视平面上更符合特定需求。它可以提供更好的图像展示效果、改善图像质量,并为后续的图像处理任务提供更准确的输入。

一些常见的使用场景包括:

  1. 图像矫正:纠正斜视图像、校正摄像头畸变等。
  2. 图像拼接:将多张图像拼接成全景图像。
  3. 虚拟现实:生成虚拟场景,将虚拟物体与实际场景进行融合。
  4. 目标检测和跟踪:根据目标在图像中的投影变换来跟踪目标。
  5. 图像处理:应用各种几何变换、形状变换和视角变换等。

总之,透视变换是一种强大的图像处理技术,可以对图像进行透视变换,改变视角和形状,广泛应用于计算机视觉、图像处理和图形学领域。

代码实现过程如下所示:文章来源地址https://www.toymoban.com/news/detail-501009.html

import cv2
import numpy as np
import matplotlib.pyplot as plt

# class Trans:
# 	def __init__(self,x,y,n):
# 		self.x=x
# 		self.y=y
# 		self.n=n
#
# 	def Trs(self):
# 		r,theta=cv2.cartToPolar(x,y,angleInDegrees=True)
# 		xr,yr=cv2.polarToCart(r,theta,angleInDegrees=1)
# 		print(xr,yr)
#
# 		plt.figure(figsize=(9, 5))
# 		plt.subplot(121), plt.title("Cartesian coordinate"), plt.plot(x, y, 'o')
# 		for i, txt in enumerate(n):
# 			plt.annotate(txt, (x[i], y[i]))
# 		plt.subplot(122), plt.title("Polar coordinate"), plt.plot(r, theta, 'o')
# 		for i, txt in enumerate(n):
# 			plt.annotate(txt, (r[i], theta[i]))
# 		plt.show()
#
#
# x = np.float32([0, 1, 2, 0, 1, 2, 0, 1, 2]) - 1
# y = np.float32([0, 0, 0, 1, 1, 1, 2, 2, 2]) - 1
# n = np.arange(9)
# to=Trans(x,y,n)
# to.Trs()

class Trans:
	def __init__(self,image_path):
		self.image_path=image_path

	def Trs(self):
		img=cv2.imread(self.image_path)

		if img is None:
			print('Unable to load image!')
		else:
			h,w=img.shape[:2]
			cx,cy=int(w/2),int(h/2)
			maxR=max(cx,cy)

			imgPolar = cv2.linearPolar(img, (cx, cy), maxR, cv2.INTER_LINEAR)
			imgPR = cv2.rotate(imgPolar, cv2.ROTATE_90_COUNTERCLOCKWISE)

			self.show_image(img,imgPR)

	def show_image(self,img,imgPR):
		plt.figure(figsize=(10, 6))
		plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title("Original"), plt.axis('off')
		plt.subplot(122), plt.imshow(cv2.cvtColor(imgPR, cv2.COLOR_BGR2RGB)), plt.title("PolarTrans"), plt.axis('off')
		plt.show()

imgfile="Images/Atest1.jpg"
to=Trans(imgfile)
to.Trs()

到了这里,关于图像的透视变换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV利用透视变换矫正图像

    案例:使用OpenCV将一张折射的图片给矫正过来 实现步骤: 1.载入图像 2.图像灰度化 3.二值分割 4.形态学操作去除噪点 5.轮廓发现 6.使用霍夫直线检测,检测上下左右四条直线(有可能是多条,但是无所谓) 7.绘制出直线 8.寻找与定位上下左右是条直线 9.拟合四条直线方程 1

    2024年02月06日
    浏览(66)
  • 使用opencv对图像进行透视变换

    一.什么是透视变换 透视变换就是透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。简单的来说就是

    2024年02月08日
    浏览(50)
  • Python中OpenCV透视变换恢复扭曲图像

    在处理图像问题时,经常会遇到将要处理的目标的位置是斜的,需要使用透视变换进行矫正。如下图,该图片中左边的目标是扭曲倾斜拍摄的,那么任务就是将其矫正过来,如下图右图所示。 前提1:这里假设我已经知道四个点坐标(可用深度学习方法检测/分割)和目标宽高

    2024年01月20日
    浏览(50)
  • 【Python图像处理篇】opencv中的仿射变换和透视变换

    仿射变换可以将矩形图片映射为平行四边形, 透视变换可以将矩形图片映射为任意四边形。 opencv提供了两个变换函数,cv2.warpAffine和cv2.warpPerspective, 使用这两个函数可以实现所有类型的变换。 cv2.warpAffine 接收的参数2x3的变换矩阵; 而 cv2.warpPerspective 接收的3x3的变换矩阵。

    2024年01月24日
    浏览(67)
  • 【OpenCV实现图像:使用OpenCV进行图像处理之透视变换】

    透视变换(Perspective Transformation)是一种图像处理中常用的变换手段,它用于将图像从一个视角映射到另一个视角,常被称为投影映射。透视变换可以用于矫正图像中的透视畸变,使得图像中的物体在新的视平面上呈现更加规则的形状。 透视变换通常涉及到寻找图像中的特定

    2024年02月03日
    浏览(64)
  • Opencv-C++笔记 (16) : 几何变换 (图像的翻转(镜像),平移,旋转,仿射,透视变换)

    图像旋转是指图像按照某个位置转动一定的角度的过程,旋转中图像仍保持着原始尺寸。图像旋转后图像水平对称轴、垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换。 假设有一个点:P(x,y),它在绕原点 O(0,0) 旋转 β 后,被转换成

    2024年02月14日
    浏览(71)
  • opencv-25 图像几何变换04- 透视 cv2.warpPerspective()

    透视是一种几何学概念,用于描述在三维空间中观察物体时,由于视角的不同而产生的变形效果。在现实世界中,当我们从不同的角度或位置观察物体时,它们会呈现出不同的形状和大小。这种现象被称为透视效果。 透视效果主要由以下几个因素造成: 远近关系 :在视野范

    2024年02月15日
    浏览(51)
  • 基于OpenCV的图像透视变换详解(从理论到实现再到实践)

             一直无法理解两种仿射变换与透视变换的区别,因此详细学习了两种变换的具体细节,重新书写了公式,并给出自己的一些看法。         可以认为, 仿射变换 是 透视变换 的一种 特例 。         仿射变换 是一种 二维坐标 到 二维坐标 之间的 线性变换

    2024年02月01日
    浏览(35)
  • 逆透视变换——变换矩阵的Python实现

    透视变换原理和变换矩阵的python实现 个人理解,可能有误,欢迎讨论。 进行透视变换,需要选择四个点,这些点定义了一个长方形,但是在原始图像中由于照相角度等问题,它并没有呈现出是一个长方形,为了变换视角,我们需要进行透视变换。 透视变换本质上是将图片从

    2024年02月02日
    浏览(39)
  • 计算机图形图像技术(OpenCV核心功能、图像变换与图像平滑处理)

    1、显示图像 ①功能:在指定窗口中显示图像。 ②参数: name 为窗口的名字; image 为待显示的图像。 ③说明:可显示彩色或灰度的字节图像和浮点数图像,彩色图像数据按BGR顺序存储。 2、读入图像 ①功能:从指定文件读入图像。 ②参数: filename 为图像文件名,支持BMP、

    2024年02月03日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包