一、概念
仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。
仿射变换保持了二维图形的平直性和平行性。平直性:变换是直线的,变换后还是直线;平行性:二维图形之间的相对位置关系保持不变。
二、OpenCV的仿射实现
1. warpAffine
实现仿射变换
cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) -> dst
- src表示输入图像
- M为转换矩阵2*3,需要手动给出
- dsize表示输出图像的size,用来截取从原点到size的大小的图片
2. getRotationMatrix2D
计算二维旋转变换矩阵
cv2.getRotationMatrix2D(center,angle,scale)->retval
- center为旋转中心
- angle为旋转角度
- scale为缩放比例
3. cv2.getAffineTransform(src, dst)
提供了计算转换矩阵的方法。
- src和dst分别表示输出坐标和输出坐标
注意,这里坐标数量应该为3个;
返回值为期望的转换矩阵M;
4. 代码实例
# -*- coding: utf-8 -*- import cv2 fn="test3.jpg" img=cv2.imread(fn) w=img.shape[1] h=img.shape[0] #得到仿射变换矩阵,完成旋转 #中心 mycenter=(h/2,w/2) #旋转角度 myangle=90 #缩放尺度 myscale=0.5 #仿射变换完成缩小并旋转 transform_matrix=cv2.getRotationMatrix2D(mycenter,myangle,myscale) newimg = cv2.warpAffine(img,transform_matrix,(w,h)) cv2.imshow('preview',newimg) cv2.waitKey() cv2.destroyAllWindows()
4. cv2.resize
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst
参数说明:
src - 原图
dst - 目标图像。当参数dsize不为0时,dst的大小为size;否则,它的大小需要根据src的大小,参数fx和fy决定。dst的类型(type)和src图像相同
dsize - 目标图像大小。当dsize为0时,它可以通过以下公式计算得出:
dsize = Size(round(fx*src.cols), round(fy*src.rows))
所以,参数dsize和参数(fx, fy)不能够同时为0
fx - 水平轴上的比例因子。当它为0时,计算公式如下:
(double)dsize.width/src.cols
fy - 垂直轴上的比例因子。当它为0时,计算公式如下:
(double)dsize.height/src.rows
interpolation - 插值方法。共有5种:
- INTER_NEAREST - 最近邻插值法
- INTER_LINEAR - 双线性插值法(默认)
- INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。
- INTER_CUBIC - 基于4x4像素邻域的3次插值法
- INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值
代码
# -*- coding: utf-8 -*- import cv2 image = cv2.imread('test.jpg') res = cv2.resize(image, (64, 48), interpolation=cv2.INTER_CUBIC) cv2.imshow('src', image) cv2.imshow('resize', res) cv2.waitKey(0) cv2.destoryAllWindows()
本文暂时没有评论,来添加一个吧(●'◡'●)