OpenCV Python 学习笔记(三) 仿射变换
2017-10-04 17:26
211 查看
什么是仿射变换?
仿射变换就是图像的线性变换加上平移,用一幅图表示,就是
![](https://img-blog.csdn.net/20171004173106961)
由 image1 到 image2 的转换经过了三个操作
旋转 (线性变换)
缩放操作(线性变换)
平移 (向量加)
如果没有了第3个平移的操作,那它就是线性变换。前两个笔记已经整理了图像的旋转、缩放和平移的各个方法,接下来会介绍仿射变换的矩阵表示和使用方法。
放射变化的矩阵形式
图像的变换要对图像的每一个像素点进行操作,假设其中的一个像素点的坐标是(x,y),我们用矩阵形式表示:
![](https://img-blog.csdn.net/20171004174439852)
我们通常使用
![](http://www.opencv.org.cn/opencvdoc/2.3.2/html/_images/math/a832b76c4f4a4ec13ac1b557da4fed6006e64d00.png)
矩阵来表示仿射变换。
![](https://img-blog.csdn.net/20171004174728944)
矩阵
A、B 就是变换矩阵
经过仿射变换后的点的矩阵坐标是T,我们已经知道放射变换就是线性变换加上平移,用矩阵表示的话就是
![](http://www.opencv.org.cn/opencvdoc/2.3.2/html/_images/math/7b0b4b830b85f222266aa9c8fc76e1a7ce998c42.png)
也可以写成
![](http://www.opencv.org.cn/opencvdoc/2.3.2/html/_images/math/f44f98e19b4ee0613633b70414a47259846b2d27.png)
计算可得
![](http://www.opencv.org.cn/opencvdoc/2.3.2/html/_images/math/3295a3e90f963d7a35c1cd910b9258cd92761a8f.png)
使用代码
来看一下之前说过的图像平移的代码
可以看到第7行
将这个二维矩阵的值带入T,得到经过仿射变换后的点的坐标是(x+200,y+100),即将整个图像平移(200,100)
再看图像旋转的代码
大部分同上类似,只是其中的 M 矩阵不同
cv2.getRotationMatrix2D这个函数就是生成图像旋转的所需要的矩阵
那么如何通过仿射变换任意变换图形呢?
我们需要源图像和目标图像上分别一一映射的三个点来定义仿射变换
示例代码:
结果:
仿射变换就是图像的线性变换加上平移,用一幅图表示,就是
由 image1 到 image2 的转换经过了三个操作
旋转 (线性变换)
缩放操作(线性变换)
平移 (向量加)
如果没有了第3个平移的操作,那它就是线性变换。前两个笔记已经整理了图像的旋转、缩放和平移的各个方法,接下来会介绍仿射变换的矩阵表示和使用方法。
放射变化的矩阵形式
图像的变换要对图像的每一个像素点进行操作,假设其中的一个像素点的坐标是(x,y),我们用矩阵形式表示:
我们通常使用
![](http://www.opencv.org.cn/opencvdoc/2.3.2/html/_images/math/a832b76c4f4a4ec13ac1b557da4fed6006e64d00.png)
矩阵来表示仿射变换。
矩阵
A、B 就是变换矩阵
经过仿射变换后的点的矩阵坐标是T,我们已经知道放射变换就是线性变换加上平移,用矩阵表示的话就是
![](http://www.opencv.org.cn/opencvdoc/2.3.2/html/_images/math/7b0b4b830b85f222266aa9c8fc76e1a7ce998c42.png)
也可以写成
![](http://www.opencv.org.cn/opencvdoc/2.3.2/html/_images/math/f44f98e19b4ee0613633b70414a47259846b2d27.png)
计算可得
![](http://www.opencv.org.cn/opencvdoc/2.3.2/html/_images/math/3295a3e90f963d7a35c1cd910b9258cd92761a8f.png)
使用代码
来看一下之前说过的图像平移的代码
import cv2 import numpy as np img = cv2.imread('Rachel.jpg', 0) rows, cols = img.shape M = np.float32([[1, 0, 200], [0, 1, 100]]) dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow('img', dst) k = cv2.waitKey(0) if k == ord('s'): cv2.imwrite('Rachel3.jpg', dst) cv2.destroyAllWindows()
可以看到第7行
M = np.float32([[1, 0, 200], [0, 1, 100]])
将这个二维矩阵的值带入T,得到经过仿射变换后的点的坐标是(x+200,y+100),即将整个图像平移(200,100)
再看图像旋转的代码
import cv2 img = cv2.imread('Rachel.jpg', 0) rows, cols = img.shape M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 90, 1) dst = cv2.warpAffine(img, M, (cols, rows)) # 仿射变换,以后再说 cv2.imshow('Rachel', dst) cv2.waitKey(0) cv2.destroyAllWindows()
大部分同上类似,只是其中的 M 矩阵不同
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 90, 1) # 第一个参数是中心点的坐标
cv2.getRotationMatrix2D这个函数就是生成图像旋转的所需要的矩阵
那么如何通过仿射变换任意变换图形呢?
我们需要源图像和目标图像上分别一一映射的三个点来定义仿射变换
示例代码:
img = cv2.imread('Rachel.jpg') rows, cols, ch = img.shape pts1 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]]) pts2 = np.float32([[cols * 0.2, rows * 0.1], [cols * 0.9, rows * 0.2], [cols * 0.1, rows * 0.9]]) M = cv2.getAffineTransform(pts1, pts2) dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow('image', dst) k = cv2.waitKey(0) if k == ord('s'): cv2.imwrite('Rachel1.jpg', dst) cv2.destroyAllWindows()
结果:
相关文章推荐
- 《OpenCV 3计算机视觉:Python语言实现》学习笔记——目标跟踪中基本运动检测的思考
- Python OpenCV学习笔记之:基本绘图
- opencv_python学习笔记十二
- Python OpenCV学习笔记之:处理鼠标事件
- Python OpenCV学习笔记之:图像阈值操作
- python OpenCV学习笔记(二十三):二维直方图
- python OpenCV学习笔记(二十四):直方图反向投影
- OpenCV python 学习笔记(四)
- Python OpenCV学习笔记之:图像数学形态操作
- OpenCV之Python学习笔记
- openCV Python 学习笔记(一)图像的基本操作
- python OpenCV学习笔记(六):图片的基本操作
- Caffe深度学习入门——Ubuntu16.04 + CUDA9.1+cudnn7.5 + opencv3.3.1+python3.5+caffe安装参考博客和跳坑笔记
- python OpenCV学习笔记(七):图片的算术运算
- OpenCV之Python学习笔记
- Python OpenCV学习笔记之:判断OpenCV是否已经打开优化功能
- Python OpenCV学习笔记之:图像读取,显示及保存
- python-opencv学习笔记
- Python OpenCV学习笔记之:颜色空间转换
- python3.6.3+opencv3.3.0学习笔记二环境配置