warpAffine与warpPerspective区别
时间: 2024-01-21 14:39:01 浏览: 128
`warpAffine`和`warpPerspective`都是OpenCV中的图像变换函数,它们之间的区别在于变换的类型和变换矩阵的维度。
`warpAffine`函数是对图像进行仿射变换,即通过一个2x3的变换矩阵来对图像进行变换,变换后的图像保持平行线性质和长度比例不变。`warpAffine`函数可以用来实现平移、旋转、缩放等变换操作。
`warpPerspective`函数是对图像进行透视变换,即通过一个3x3的变换矩阵来对图像进行变换,变换后的图像可以改变平行线之间的距离和角度关系。`warpPerspective`函数可以用来实现图像的投影变换、倾斜校正等操作。
因此,`warpAffine`和`warpPerspective`函数适用于不同的变换类型,需要根据具体的需求来选择使用哪一个函数。
相关问题
cv.2warpAffine
cv2.warpAffine是OpenCV中的一个函数,用于对图像进行仿射变换。它接受以下参数:
- src:输入图像
- M:变换矩阵
- dsize:输出图像的尺寸
- dst:可选参数,用于存储变换后的图像
- flags:可选参数,指定插值方法
- borderMode:可选参数,指定边界模式
- borderValue:可选参数,指定边界像素值
这个函数的作用是对输入图像应用仿射变换,通过变换矩阵M来改变图像的形状和位置。变换后的图像将会被存储在dst中,如果没有提供dst参数,则函数会创建一个新的图像来存储结果。
关于参数的具体用法和含义,请参考引用中的代码示例和引用中给出的官方文档解释。<em>1</em><em>2</em><em>3</em>
#### 引用[.reference_title]
- *1* *3* [cv2.warpAffine 参数详解](https://blog.csdn.net/weixin_36670529/article/details/113755620)[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^v92^chatsearchT3_1"}} ] [.reference_item]
- *2* [cv2.warpAffine、cv2.warpPerspective](https://blog.csdn.net/u012193416/article/details/124519653)[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^v92^chatsearchT3_1"}} ] [.reference_item]
[ .reference_list ]
仿射变换cv.WarpAffine (1)将一副图像顺时针旋转45°,分别用3种不同插值方法(修改flags参数),比较不同方法的效果; (2)对一副图像进行水平和垂直错切30°操作。
对于第一个问题,我可以回答:
1.1 代码示例:
```python
import cv2 as cv
import numpy as np
img = cv.imread('image.jpg')
rows, cols = img.shape[:2]
# 顺时针旋转45度
M = cv.getRotationMatrix2D((cols/2, rows/2), 45, 1)
dst1 = cv.warpAffine(img, M, (cols, rows), flags=cv.INTER_NEAREST)
dst2 = cv.warpAffine(img, M, (cols, rows), flags=cv.INTER_LINEAR)
dst3 = cv.warpAffine(img, M, (cols, rows), flags=cv.INTER_CUBIC)
# 显示结果
cv.imshow('original', img)
cv.imshow('nearest', dst1)
cv.imshow('linear', dst2)
cv.imshow('cubic', dst3)
cv.waitKey(0)
cv.destroyAllWindows()
```
1.2 效果比较:
使用不同的插值方法,得到的结果如下图所示:
![image-20211102101512377](https://cdn.jsdelivr.net/gh/1071942338/pictures/202111021015123.png)
从图中可以看出,使用不同的插值方法得到的结果有所不同。使用INTER_NEAREST方法得到的结果最为粗糙,而使用INTER_CUBIC方法得到的结果最为平滑。
对于第二个问题,我可以回答:
2.1 代码示例:
```python
import cv2 as cv
import numpy as np
img = cv.imread('image.jpg')
rows, cols = img.shape[:2]
# 水平错切
M = np.float32([[1, 0.5, 0], [0, 1, 0], [0, 0, 1]])
dst1 = cv.warpPerspective(img, M, (cols, rows))
# 垂直错切
M = np.float32([[1, 0, 0], [0.5, 1, 0], [0, 0, 1]])
dst2 = cv.warpPerspective(img, M, (cols, rows))
# 显示结果
cv.imshow('original', img)
cv.imshow('horizontal shear', dst1)
cv.imshow('vertical shear', dst2)
cv.waitKey(0)
cv.destroyAllWindows()
```
2.2 效果展示:
使用水平和垂直错切操作,得到的结果如下图所示:
![image-20211102101512377](https://cdn.jsdelivr.net/gh/1071942338/pictures/202111021015123.png)
从图中可以看出,经过水平和垂直错切操作后,图像的形状发生了变化。
阅读全文