【opencv】图像处理之相似变换、仿射变换、透视变换

■ Similarity Transform(相似变换)

Similarity Transform(相似变换) = Rotation(旋转) + Translation(平移) + Scale(放缩)

● 性质:Right angle is still right angle (保角性)

代码:

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

img = cv2.imread('lenna.jpg', 1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# print(img.shape)

# 得到相似变换的矩阵  # center:旋转中心 angle:旋转角度   scale:缩放比例
M = cv2.getRotationMatrix2D(center = (img.shape[0]/2,img.shape[1]/2),
                              angle = 30,
                              scale = 0.5) 

# 原图像按照相似矩阵进行相似变换  三个参数:原图像,相似矩阵,画布面积
img_rotate = cv2.warpAffine(img, M, (img.shape[0], img.shape[1]))

plt.figure(figsize=(8,8))
plt.subplot(1,2,1)
plt.imshow(img)
plt.subplot(1,2,2)
plt.imshow(img_rotate)
plt.show()

原图和相似变换后的图像:
在这里插入图片描述

■ Affine Transform(仿射变换)

● 性质:Parallel lines are still parallel lines(不再具有保角性,具有保平行性)
● 三个非共线的点对(6 parameters)确定一个仿射变换。

代码:

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

# 3 Src(原始) Points + 3 Dst(目标) Points
# cols:列/长  rows:行/宽

img = cv2.imread('lenna.jpg', 1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# print(img.shape)

cols = img.shape[0]
rows = img.shape[1]

pt1 = np.float32([[0,0], [cols, 0], [0, rows]])
pt2 = np.float32([[cols*0.3, rows*0.3], [cols*0.8, rows*0.2], [cols*0.1, rows*0.9]])

# [[0,0], [cols, 0], [0, rows]] --> [[cols*0.3, rows*0.3], [cols*0.8, rows*0.2], [cols*0.1, rows*0.9]]
M = cv2.getAffineTransform(pt1, pt2)       # 仿射变换矩阵
dst = cv2.warpAffine(img, M, (cols, rows))

plt.figure(figsize=(8,8))
plt.subplot(1,2,1)
plt.imshow(img)
plt.subplot(1,2,2)
plt.imshow(dst)
plt.show()

原图和相似变换后的图像:
在这里插入图片描述

■ Perspective Transform(透视/投影变换)

● 性质:Lines are still lines(不保角,不保平行,保直线性)
● 四个非共线的点对(8 parameters)确定一个透视变换。

代码:

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

img = cv2.imread('lenna.jpg', 1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

width = img.shape[1]
height = img.shape[0]

pts1 = np.float32([[0,0], [width,0], [0,height], [width,height]])
pts2 = np.float32([[width*0.1,height*0.1], [width*0.9, width*0.1], [height*0.2,height*0.8], [width*0.7,height*0.7]])

M_warp = cv2.getPerspectiveTransform(pts1, pts2)     # 单应性矩阵
img_warp = cv2.warpPerspective(img, M_warp, (width, height))

plt.figure(figsize=(8,8))
plt.subplot(1,2,1)
plt.imshow(img)
plt.subplot(1,2,2)
plt.imshow(img_warp)
plt.show()

原图和透视变换后的图像:
在这里插入图片描述

  • 11
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
图像配准是指将两幅或多幅图像进行对齐,使它们在几何形状和外观上尽可能的相似。而透视变换是一种仿射变换的扩展,可以将一个平面上的任意四边形转换为另一个平面上的任意四边形。 基于OpenCV的图像配准之后,可以使用透视变换来实现图像的矫正、纠偏等操作。具体步骤如下: 1. 首先,通过图像配准的方法将待处理的图像对齐,得到对应的变换矩阵; 2. 然后,利用该变换矩阵进行透视变换,将图像进行矫正、纠偏等操作; 3. 最后,可以进行进一步的图像处理,如图像增强、目标检测等。 下面是一个基于OpenCV透视变换示例代码: ``` import cv2 import numpy as np # 读取原始图像 img = cv2.imread('test.png') # 设置目标图像的四个顶点 dst_points = np.float32([[100, 100], [500, 100], [500, 500], [100, 500]]) # 设置原始图像的四个顶点 src_points = np.float32([[10, 10], [630, 10], [630, 470], [10, 470]]) # 计算透视变换矩阵 M = cv2.getPerspectiveTransform(src_points, dst_points) # 进行透视变换 dst_img = cv2.warpPerspective(img, M, (600, 600)) # 显示结果 cv2.imshow('src_img', img) cv2.imshow('dst_img', dst_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 其中,dst_points 和 src_points 分别表示目标图像和原始图像的四个顶点坐标,通过 cv2.getPerspectiveTransform 方法计算透视变换矩阵 M,然后通过 cv2.warpPerspective 方法进行透视变换,最终得到矫正后的图像 dst_img。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值