图像缩放旋转平移
在OpenCV中我们经常会用到图像的缩放,旋转以及平移,比如有的时候我们想对一类图片进行操作,这个时候我们就需要对这一类的图片进行尺寸统一,在以后深度学习的学习中,我们也会发现,对于数据集的训练,它们的数据集样本通常都是尺寸统一的。
▼ 缩放
在OpenCV中,使用函数cv2.resize()实现对图像的缩放。
语法格式为:
dst = cv2.resize( src, dsize[ ,fx[, fy[ ,interpolation]]])
src:原图片
dsize:缩放图片尺寸,如果dsize=0,默认计算方式如下dsize=Size(round(fx∗src.cols),round(fy∗src.rows))
fx fy和dsize不能同时为0 fx,fy分别是在x,y轴上的缩放系数,默认取0时,fx=(double)dsize.width/src.cols ,fy=(double)dsize.height/src.cols,默认参数为0可以不写如里面。
interpolation:差值方式使用默认即可。默认的是INTER_LINEAR - a bilinear interpolation (used by default)现行差值,如下图所示。
我们习惯的坐标表示是:先x横坐标,再y纵坐标。在图像处理中,这种惯性思维经常情况下是错误的。
因为在计算机中,图像是以矩阵的形式保存的,先行后列。所以,一张 宽×高×颜色通道=480×256×3 的图片会保存在一个 256×480×3 的三维张量中。图像处理时也是按照这种思想进行计算的(其中就包括 OpenCV 下的图像处理),即 高×宽×颜色通道。
但是问题来了,cv2.resize这个API却是个小例外。因为它的参数输入却是 宽×高×颜色通道。
我们来看代码:
import cv2pic = cv2.imread("cat.jpg")cv2.imshow("org",pic)pic = cv2.resize(pic, (400, 400), interpolation=cv2.INTER_CUBIC)cv2.imshow('res', pic)cv2.waitKey(0)cv2.destroyAllWindows()
先看原图效果:
再看缩放之后的效果:
我们发现,用这种方法缩小之后的宽高比跟原图并非一样,现在我们可以进行代码的改进:
import cv2pic = cv2.imread("cat.jpg")cv2.imshow("org",pic)pic = cv2.resize(pic, (0, 0), fx=0.5, fy=0.5,interpolation=cv2.INTER_NEAREST)cv2.imshow('res', pic)cv2.waitKey(0)cv2.destroyAllWindows()
我们直接来看缩放之后的图像:
在这里,如果我们不直接指定缩放后大小,则通过fx和fy直接指定缩放比例,0.5则长宽都为原来一半。
▼ 旋转
OpenCV中对图像的旋转主要是先通过getRotationMatrix2D函数得到图像的旋转矩阵,然后再通过仿射变换函数warpAffine得到旋转后的图像。
我们看一下函数:
cv2.getRotationMatrix2D(center, angle, scale)
center:旋转中心点 (cx, cy) ,你可以随意指定。
angle