做计算机视觉方向,除了流行的各种深度学习算法,很多时候也要会基础的图像处理方法。

记录下opencv的一些操作(图像映射变换),日后可以方便使用

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

先上一张效果图

python-图像处理(映射变换) Python 第1张

图二和图三是同一种方法,只是变换矩阵不同,都是3点映射变换

图四使用的是4点映射变换

--------------------------------------------------------------------------------------------------------------------------------------------------

简单介绍下原理

图像都知道是3维(通道)的矩阵,前两维就是由1字节(0-255)数字填充的二维数组。数字大小代表颜色的深浅。

我们把变换前的原图作为x和y。变换后的图为u和v。将[x,y,1]乘上变换矩阵就可以得到对应的新的u和v。不同的变换矩阵有不同的作用(不同的变换方式)

python-图像处理(映射变换) Python 第2张

-------------------------------------------------------------------------------------------------------------------------------------------------

所以现在就是求不同变换对应的不同的变换矩阵的过程

求这个矩阵 在opencv中直接就有方法 

只需提供原图的三个点和你要变换之后的三个点的映射位置(3个原图点,3个映射点)就可以求出这个变换矩阵

python-图像处理(映射变换) Python 第3张         python-图像处理(映射变换) Python 第4张

当然了  你会发现不管怎么调整映射点 都不能任意变换

因为只给三个点时 变换之后的图其实只是原图的等比缩放,并不能做到随意映射的效果

 

这里opencv也提供了 四个点和四个映射的方法 求出对应的变换矩阵 ,最终得到任意映射的效果

python-图像处理(映射变换) Python 第5张

 

代码如下:

 1 # coding=gbk
 2 import cv2
 3 import numpy as np
 4 import matplotlib.pyplot as plt
 5 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
 6 plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
 7 
 8 img=cv2.imread(r"test6.jpg")
 9 img = img[:,:,[2,1,0]]
10 cols,rows,ch=img.shape
11 
12 pts1 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]])                                 #三点映射
13 pts2 = np.float32([[0, 0], [cols - 1, 0], [80, rows - 1]])
14 pts21 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]])
15 pts22 = np.float32([[cols * 0.2, rows * 0.1], [cols * 0.9, rows * 0.2], [cols * 0.1, rows * 0.9]])
16 pts31 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1],[cols - 1,rows-1]])              #四点映射
17 pts32 = np.float32([[0, 0], [cols - 1, 0], [50, rows - 1],[cols - 50,rows-50]])
18 
19 M = cv2.getAffineTransform(pts1,pts2)                                                     #求三点映射的变换矩阵
20 M2= cv2.getAffineTransform(pts21,pts22)
21 M3 = cv2.getPerspectiveTransform(pts31,pts32)                                             #求四点映射的变换矩阵
22 
23 dst = cv2.warpAffine(img,M,(rows+120,cols))                                               #三点映射的变换函数
24 dst2 = cv2.warpAffine(img,M2,(rows,cols))                                               
25 dst3 = cv2.warpPerspective(img,M3,(rows+40,cols+50))                                      #四点映射的变换函数
26 
27 plt.subplot(221)
28 plt.imshow(img)
29 plt.title("原图")
30 plt.subplot(222)
31 plt.imshow(dst)
32 plt.title("投影变换")
33 plt.subplot(223)
34 plt.imshow(dst2)
35 plt.title("仿射原图变换")
36 plt.subplot(224)
37 plt.imshow(dst3)
38 plt.title("仿射不规则变换")
39 
40 plt.show()

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄