OpenCV-19图像的仿射变换

放射变换是图像旋转,缩放,平移的总称,具体的做法是通过一个矩阵和原图片坐标进行计算,得到新的坐标,完成变换,所以关键就是这个矩阵。

一、仿射变换之图像平移

使用API------warpAffine(src ,M, dsize, flags, mode, value)

warp:弯曲             affine:仿射

其中src为图片

M:变换矩阵

dsize:输出图片大小

flag: 与resize中的插值算法一直

mode:边界外推法标志

value:填充边界值

平移矩阵:矩阵中的每个像素由(x,y)组成(x,y)表示这个像素的坐标,假设沿x轴平移tx,沿y轴平移ty,那么最后得到的坐标为(x,y) =  (x + tx, y + ty),用矩阵表示就是:

第一个坐标代表列,第二个坐标代表行。

示例代码如下:

import cv2
import numpy as np


dog = cv2.imread("dog.png")
h, w, ch = dog.shape
print(dog.shape)   # 先行后列

# 写下变换矩阵,最少是float32位
M = np.float32([[1, 0, 200], [0, 1, 0]])  # 第一个对应水平平移,第二个对应上下平移
new_dog = cv2.warpAffine(dog, M,  dsize=(w, h))   # 先列后行

cv2.imshow("dpg", dog)
cv2.imshow("new_dpg", new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

二、仿射变换之获取变换矩阵

第一中获取变换方程的方法

OpenCV提供了计算变换矩阵的API---getRotationMatrix2D(center, angle, scale)

center: 中心点,以图片的哪个点作为旋转时的中心点

angle:旋转的角度,按照逆时针旋转。

scale:缩放比例,即想图片进行什么样的缩放

示例代码如下:

# M = cv2.getRotationMatrix2D((100, 100), 15, 1)   # 与原图无关 设定中心点进行旋转
M = cv2.getRotationMatrix2D((w/2, h/2), 15, 1)   # 按照图片的中心点进行旋转
new_dog = cv2.warpAffine(dog, M,  dsize=(w, h))   # 先列后行

输出结果如下:

第二种获取变换方程的方法

getAffineTransform(src[], dst[])通过三点可以确定变换后的位置,相当于解方程,3个点对应三个方程,能解出便宜的参数和旋转的角度。

相当于原图的三个点坐标变为另外三个点的坐标,图像按照坐标的格式旋转。

示例代码如下:

sre = np.float32([[200, 100], [300, 100], [200, 300]])   # 初始三个点的坐标
dst = np.float32([[100, 50], [150, 100], [100, 300]])     # 变化后三个点的坐标
M = cv2.getAffineTransform(sre, dst)
new_dog = cv2.warpAffine(dog, M, dsize=(w, h))  # 先列后行

输出结果如下:

三、仿射变换之透视变化

透视变化就是将一种坐标系变为另一种坐标系,简单来说可以把一张“斜”的图变“正”。

使用API---warpPerspective(img,M, dsize)

对于透视变换来说,M是一个3*3的矩阵。

同时使用API---getPerspectiveTransform(src, dst)获取透视变换的变换矩阵,需要4个点,即图片的四个角。

最后在通过cv.namedWindow对窗口进行缩放

示例代码如下:

src = np.float32([[100, 200], [500, 200], [100, 600], [500, 600]])    # 原图的四个坐标
dst = np.float32([[0, 0], [500, 0], [0, 300], [500, 300]])
M = cv2.getPerspectiveTransform(src, dst)
new_dog = cv2.warpPerspective(dog, M, (500, 300))
# 创建窗口对图片进行缩放
cv2.namedWindow("dog", cv2.WINDOW_NORMAL)
cv2.resizeWindow("dog", 640, 480)
cv2.imshow("dog", dog)

cv2.namedWindow("new_dog", cv2.WINDOW_NORMAL)
cv2.resizeWindow("new_dog", 640, 480)
cv2.imshow("new_dog", new_dog)

输出结果如下:

综合演示代码如下所示:

import cv2
import numpy as np

dog = cv2.imread("dog.png")
h, w, ch = dog.shape
print(dog.shape)  # 先行后列

# 写下变换矩阵,最少是float32位
# M = np.float32([[1, 0, 200], [0, 1, 0]])  # 第一个对应水平平移,第二个对应上下平移
# new_dog = cv2.warpAffine(dog, M,  dsize=(w, h))   # 先列后行

# 获取变换矩阵
# M = cv2.getRotationMatrix2D((100, 100), 15, 1)   # 与原图无关 设定中心点进行旋转
# M = cv2.getRotationMatrix2D((w / 2, h / 2), 15, 1)  # 按照图片的中心点进行旋转
# new_dog = cv2.warpAffine(dog, M, dsize=(w, h))  # 先列后行

# 通过三个点的坐标获取变换矩阵
# sre = np.float32([[200, 100], [300, 100], [200, 300]])   # 初始三个点的坐标
# dst = np.float32([[100, 50], [150, 100], [100, 300]])     # 变化后三个点的坐标
# M = cv2.getAffineTransform(sre, dst)
# new_dog = cv2.warpAffine(dog, M, dsize=(w, h))  # 先列后行

# 透视变换
src = np.float32([[100, 200], [500, 200], [100, 600], [500, 600]])    # 原图的四个坐标
dst = np.float32([[0, 0], [500, 0], [0, 300], [500, 300]])
M = cv2.getPerspectiveTransform(src, dst)
new_dog = cv2.warpPerspective(dog, M, (500, 300))

# 创建窗口对图片进行缩放
cv2.namedWindow("dog", cv2.WINDOW_NORMAL)
cv2.resizeWindow("dog", 640, 480)
cv2.imshow("dog", dog)

cv2.namedWindow("new_dog", cv2.WINDOW_NORMAL)
cv2.resizeWindow("new_dog", 640, 480)
cv2.imshow("new_dog", new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Opencv-python图像变换是通过使用不同的变换矩阵来实现的。其中,平移是一种最简单的空间变换。使用Opencv的函数cv2.warpAffine()可以实现平移操作。在代码中,我们需要定义一个变换矩阵M,这个矩阵是一个2行3列的矩阵,决定了平移的方式。其中,M矩阵中的tx和ty分别表示在x和y方向上平移的距离。更具体地说,如果我们向右平移tx个像素,向下平移ty个像素,那么变换矩阵M的定义如下: import numpy as np rows, cols = img.shape[:2] M = np.float32([[1, 0, tx], [0, 1, ty]]) dst = cv2.warpAffine(img, M, (cols, rows)) 在上述代码中,我们使用了NumPy库来创建一个2x3的浮点型变换矩阵M,并将其传递给cv2.warpAffine()函数,该函数会将图像img按照定义的方式进行平移,并生成一个新的图像dst。最后,我们可以通过cv2.imshow()函数显示平移后的图像。 除了平移之外,Opencv还提供了其他的图像变换操作,比如缩放。缩放可以按照指定的宽度和高度来调整图像的大小,也可以按照比例来进行缩放。通过cv2.resize()函数可以实现缩放操作。在代码中,我们可以使用下面的方式来进行缩放操作: import cv2 img = cv2.imread('drawing.jpg') # 按照指定的宽度、高度缩放图片 res = cv2.resize(img, (width, height)) # 按照比例缩放图片 res2 = cv2.resize(img, None, fx=scale_x, fy=scale_y, interpolation=cv2.INTER_LINEAR) 在上面的代码中,我们首先使用cv2.imread()函数读取图像,并将其存储在变量img中。然后,我们可以使用cv2.resize()函数来调整图像的大小。其中,如果我们指定了宽度和高度,那么图像将按照这些指定的大小进行缩放;如果我们指定了fx和fy的比例因子,那么图像将按照这些比例进行缩放。最后,我们可以使用cv2.imshow()函数来显示缩放后的图像。 总结起来,Opencv-python提供了多种图像变换操作,包括平移、缩放等。通过使用相应的函数和变换矩阵,我们可以实现对图像的各种变换操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [opencv-python 详解图像的几何变换缩放、平移、旋转、翻转](https://blog.csdn.net/RayChiu757374816/article/details/120036004)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一道秘制的小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值