对于一张照片我们再熟悉不过,在手机或者电脑上我们可以对图像进行缩放,旋转,这很容易实现,在一些特殊用途场合还需要对图像中的像素就进行平移或者做仿射变换和透视变换。
缩放
缩放就是对图像进行缩小和放大,OpenCV中可以用resize这个函数实现,当然这个函数也有参数resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
src代表的是原图像;
dsize代表的是目标图像的大小,当要设置目标图像的大小时可以用这个参数传入,比如(200,200)代表目标图像的大小就是200*200的;
dst代表目标图像,当dsize不为零时,目标图像大小就是desize的大小,否则就需要缩放因子fx和fy决定了;
fx代表的是水平方向的缩放因子,fy代表的是竖直方向的缩放因子,fx、fy和dsize不能同时为0;
interpolation代表的是缩放时用到的插值方法,因为缩放的原理就是根据像素周边的值进行填充放大或者缩小的空间,让图片看起来和原图基本一致。
插值方法官方文档中有五种
1、INTER_NEAREST - 最近邻插值法
2、INTER_LINEAR - 双线性插值法(默认)
3、INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。
4、INTER_CUBIC - 基于4x4像素邻域的3次插值法
5、INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值
这些插值方法的效果暂时我看不出有什么差别,默认的是第二种插值方法。
接下来放代码
上面的代码是用缩放因子来缩放图像的,还可以用规定大小来设置
平移
初中数学也学过平移,比如在二维平面上有个点(x,y)要让这个点沿X轴平移a个单位,沿Y轴平移b个单位,那么这个点平移后的坐标为(x+a,y+b)。图像刚好是平面,平移的原理也是一样的,就是把像素点移动
算出来的结果是
结果刚好和刚刚的理论一样,在OpenCV中有封装好的函数进行计算,这里要用到一个函数warpAffine(src, M, dsize),同样的src表示原图像,M表示变换矩阵,dsize表示目标图像的大小,跟上面一样。首先我们需要用numpy构建一个矩阵M,然后把矩阵传给warpAffine()这个函数,接下来就可以得到变换后的图像了。
原图如下
平移后效果
旋转
旋转的原理和平移的原理也差不多,都是通过计算变换后的位置来实现,还是要构建矩阵。旋转的矩阵是这样的
当然在OpenCV中已经有相应的函数去构建矩阵了,我们只需要调用就好了。
getRotationMatrix2D(rotate_center, degree, scale),otate_center表示的是旋转中心,degree表示旋转角度,scale表示旋转后的缩放因子,然后他就会构建矩阵,把这个矩阵传给warpAffine()这个函数,就完成了旋转的操作。
旋转后效果图
仿射变换
在仿射变换后,原图中平行的线,变换后还是保持平行,这个变换还是会用到矩阵,也有一个函数进行构造,构造之前需要定义三个点以及他们在变换后图像的位置,然后把这些位置传给getAffineTransform()这个函数,这个函数会生成一个2*3的矩阵,然后把矩阵传给warpAffine()这个函数,变换就完成了。
效果图如下
透视变换
透视变换后原图中是直线的,变换后还是直线。同样的构造矩阵前要选择四个点以及变换后的位置,这四个点任意三个点都不能共线,然后传给函数getPerspectiveTransform()生成3*3的矩阵,然后把矩阵传给warpPerspective()这个函数。
随便举的一个例子,没想要什么作用,效果就这样
领取专属 10元无门槛券
私享最新 技术干货