做计算机视觉方向,除了流行的各种深度学习算法,很多时候也要会基础的图像处理方法。
记录下opencv的一些操作(图像映射变换),日后可以方便使用
先上一张效果图
图二和图三是同一种方法,只是变换矩阵不同,都是3点映射变换
图四使用的是4点映射变换
简单介绍下原理
图像都知道是3维(通道)的矩阵,前两维就是由1字节(0-255)数字填充的二维数组。数字大小代表颜色的深浅。
我们把变换前的原图作为x和y。变换后的图为u和v。将[x,y,1]乘上变换矩阵就可以得到对应的新的u和v。不同的变换矩阵有不同的作用(不同的变换方式)
所以现在就是求不同变换对应的不同的变换矩阵的过程
求这个矩阵 在opencv中直接就有方法
只需提供原图的三个点和你要变换之后的三个点的映射位置(3个原图点,3个映射点)就可以求出这个变换矩阵
当然了 你会发现不管怎么调整映射点 都不能任意变换
因为只给三个点时 变换之后的图其实只是原图的等比缩放,并不能做到随意映射的效果
这里opencv也提供了 四个点和四个映射的方法 求出对应的变换矩阵 ,最终得到任意映射的效果
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
# coding=gbk
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcparams[ 'font.sans-serif' ] = [ 'simhei' ] #用来正常显示中文标签
plt.rcparams[ 'axes.unicode_minus' ] = false #用来正常显示负号
img = cv2.imread(r "test6.jpg" )
img = img[:,:,[ 2 , 1 , 0 ]]
cols,rows,ch = img.shape
pts1 = np.float32([[ 0 , 0 ], [cols - 1 , 0 ], [ 0 , rows - 1 ]]) #三点映射
pts2 = np.float32([[ 0 , 0 ], [cols - 1 , 0 ], [ 80 , rows - 1 ]])
pts21 = np.float32([[ 0 , 0 ], [cols - 1 , 0 ], [ 0 , rows - 1 ]])
pts22 = np.float32([[cols * 0.2 , rows * 0.1 ], [cols * 0.9 , rows * 0.2 ], [cols * 0.1 , rows * 0.9 ]])
pts31 = np.float32([[ 0 , 0 ], [cols - 1 , 0 ], [ 0 , rows - 1 ],[cols - 1 ,rows - 1 ]]) #四点映射
pts32 = np.float32([[ 0 , 0 ], [cols - 1 , 0 ], [ 50 , rows - 1 ],[cols - 50 ,rows - 50 ]])
m = cv2.getaffinetransform(pts1,pts2) #求三点映射的变换矩阵
m2 = cv2.getaffinetransform(pts21,pts22)
m3 = cv2.getperspectivetransform(pts31,pts32) #求四点映射的变换矩阵
dst = cv2.warpaffine(img,m,(rows + 120 ,cols)) #三点映射的变换函数
dst2 = cv2.warpaffine(img,m2,(rows,cols))
dst3 = cv2.warpperspective(img,m3,(rows + 40 ,cols + 50 )) #四点映射的变换函数
plt.subplot( 221 )
plt.imshow(img)
plt.title( "原图" )
plt.subplot( 222 )
plt.imshow(dst)
plt.title( "投影变换" )
plt.subplot( 223 )
plt.imshow(dst2)
plt.title( "仿射原图变换" )
plt.subplot( 224 )
plt.imshow(dst3)
plt.title( "仿射不规则变换" )
plt.show()
|
以上所述是小编给大家介绍的python-图像处理(映射变换)详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:https://www.cnblogs.com/bob-jianfeng/p/10574401.html