使用OpenCV实现仿射变换—平移功能
当我们打开一个图片编辑软件时,基本上都会提供几个操作:平移、缩放和旋转。特别目前在手机里拍照时,由于位置传感器的失灵,也许是软件的bug,有一次我就遇到苹果手机不管怎么样竖放,或横放,它拍摄的照片就竖不起来,后来只有关机重启才解决。这样拍摄出来的照片,如果要改变方向,只能使用编辑功能了,进行旋转。因此,几何变换的功能,在现实生活里的需求必不可少。
为了理解这个几何的问题,可以来回忆一下初中的课本内容:
从这里可以看到平移的基本性质,有了这些概念之后,就要进入解释几何,平移的表达,比如往x轴移动100,那么就是x+100,因此平移的公式就是(x1, y1)=(x+a, y+b),如下图所示:
从这个线性方程组来看,是一个二元的关系,再转换为矩阵的表示方式,你会发现使用的方式是如下:
在这里发现是使用三维矩阵来表示,为什么要这样呢?其实是为了把三种变换统一到一种表示方式,升维思想的作用。因此矩阵第三行没有什么作用的,如果一个图像要作平移,只要构造出变换矩阵,再作这个计算,就可以把坐标进行改变了,所以要平移的距离是由tx和ty决定。为了统一,旋转、缩放、平移都可以使用一个公式来表示和计算,这是升到三维数组的好处。同样在三维空间的变换,也是采用四维变换矩阵。下面通例子来演示图像平移的操作:
#python 3.7.4,opencv4.1 #蔡军生 https://blog.csdn.net/caimouse/article/details/51749579 # import cv2 import numpy as np #图片的路径 imgname = "img1.jpg" #读取图片 image = cv2.imread(imgname, cv2.imread_color) #图片的高度和宽度 h,w = image.shape[:2] #构造平移的2x3的矩阵,然后调用warpaffine执行平移 a1 = np.array([[1, 0, 50], [0, 1, 40]], np.float32) d1 = cv2.warpaffine(image, a1, (w, h), bordervalue = 125) #显示平移之后的图片 cv2.imshow("d1",d1) #显示图像 cv2.imshow("image", image) #等待用户输入,然后删除所有窗口 cv2.waitkey(0) cv2.destroyallwindows()
执行的结果如下:
左图是平移之后的图片,在左上角出现了一片空白,使用了固定颜色填充,右图是原始图片。
在这里主要使用cv2.warpaffine函数,这个函数定义如下:
cv2.warpaffine(src, m, dsize[, dst[, flags[, bordermode[, bordervalue]]]]) → dst
其中:
src - 输入图像。
m - 变换矩阵。
dsize - 输出图像的大小。
flags - 插值方法的组合(int 类型!)
bordermode - 边界像素模式(int 类型!)
bordervalue - 边界填充值; 默认情况下,它为0。
上述参数中:m作为仿射变换矩阵,一般反映平移或旋转的关系,为inputarray类型的2×3的变换矩阵。
flages表示插值方式,默认为 flags=cv2.inter_linear,表示线性插值,此外还有:cv2.inter_nearest(最近邻插值) cv2.inter_area (区域插值) cv2.inter_cubic(三次样条插值) cv2.inter_lanczos4(lanczos插值)
到这里学会了使用opencv中仿射变换的平移功能。
总结
以上所述是小编给大家介绍的使用opencv实现仿射变换—平移功能,希望对大家有所帮助