2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > opencv-python 详解图像的几何变换缩放 平移 旋转 翻转

opencv-python 详解图像的几何变换缩放 平移 旋转 翻转

时间:2019-10-10 09:20:00

相关推荐

opencv-python 详解图像的几何变换缩放 平移 旋转 翻转

作者:RayChiu_Labloy

版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

目录

缩放

平移

旋转

翻转:

我们经常会用到图像的缩放,旋转以及平移,比如有的时候我们想对一类图片进行操作,这个时候我们就需要对这一类的图片进行尺寸统一,在以后深度学习的学习中,我们也会发现,对于数据集的训练,它们的数据集样本通常都是尺寸统一的

缩放

缩放是调整图片的大小,可以指定输出图像尺寸大小,也可以指定缩放比例。

opencv函数cv2.resize()原型:

最后一个参数interpolation :差值方式使用默认即可 默认的是INTER_LINEAR

我们习惯的坐标表示是先x横坐标,再y纵坐标。在图像处理中,这种惯性思维经常情况下是错误的。因为在计算机中,图像是以矩阵的形式保存的,先行后列。所以,一张宽×高×颜色通道=480×256×3的图片会保存在一个256×480×3的三维张量中。图像处理时也是按照这种思想进行计算的(其中就包括OpenCV下的图像处理),即高×宽×颜色通道。

但是问题来了,CV2.resize这个API却是个小例外。因为它的参数输入却是宽×高×颜色通道。

测试代码:

import cv2 img = cv2.imread('drawing.jpg') # 按照指定的宽度、高度缩放图片(图像可能变形) res = cv2.resize(img, (132, 150)) # 按照比例缩放,如x,y轴均放大一倍 res2 = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR) cv2.imshow('shrink', res), cv2.imshow('zoom', res2) cv2.waitKey(0)

平移

平移实际上就是矩阵的移动,它是最简单的一种空间变换,我们需要定义下面这样一个变换矩阵,2行3列矩阵,决定了何种变换。M矩阵中的tx,ty是向x 和 y方向平移的距离,举个例子,如果是向右平移tx个像素, 向下平移ty个像素的话, 那么变换矩阵M: 平移是用仿射变换函数cv2.warpAffine() 实现的: dst=cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

参数含义:

src: 输入图像。M: 2×3 2行3列变换矩阵。dsize: 输出图像的大小。dst: 可选,输出图像,由dsize指定大小,type和src一样。flags: 可选,插值方法borderMode: 可选,边界像素模式borderValue: 可选,边界填充值; 默认为0。

图像旋转的原理:

我们根据公式:

可以得出:

所以对应的变换矩阵为:

测试代码:

import numpy as np rows, cols = img.shape[:2] # 定义平移矩阵,需要是numpy的float32类型 # x轴平移100,y轴平移50 M = np.float32([[1, 0, 100], [0, 1, 50]]) # 用仿射变换实现平移,第三个参数为输出的图像大小,值得注意的是该参数形式为(width, height)。dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow('shift', dst) cv2.waitKey(0)

效果:

旋转

旋转方式一:旋转同平移一样,也是用仿射变换实现的,因此也需要定义一个变换矩阵。OpenCV直接提供了cv2.getRotationMatrix2D()函数,该函数返回的就是仿射变换矩阵M,之后我们将这个仿射变换的矩阵传入到 仿射变换函数cv2.warpAffine()中,该函数有三个参数: 参数1:旋转中心点参数2:旋转角度(正:逆时针,负:顺时针) 参数3:缩放比例,0.5表示缩小一半

代码:

import cv2 as cv2from math import radians,cos,sin,fabs# 需要扩大画布、平移图像来达到无损旋转的效果# 参考:/developer/article/1798209def opencv_rotate(img, angle):h, w = img.shape[:2]center = (w / 2, h / 2)scale = 1.0# 2.1获取M矩阵"""M矩阵[cosA -sinA (1-cosA)*centerX+sinA*centerYsinA cosA -sinA*centerX+(1-cosA)*centerY]第一个参数:旋转中心点第二个参数:旋转角度第三个参数:缩放比例"""M = cv2.getRotationMatrix2D(center, 360 - angle, scale)# 2.2 新的宽高,radians(angle) 把角度转为弧度 sin(弧度)new_H = int(w * fabs(sin(radians(angle))) + h * fabs(cos(radians(angle))))new_W = int(h * fabs(sin(radians(angle))) + w * fabs(cos(radians(angle))))# 2.3 平移M[0, 2] += (new_W - w) / 2M[1, 2] += (new_H - h) / 2rotate = cv2.warpAffine(img, M, (new_W, new_H), borderValue=(0, 0, 0))return rotate

效果:

旋转方式二:

可以利用矩阵操作cv2.transpose()来实现90旋转,好处是不会出现仿射变换后图片周围的空缺区域。

transpose()旋转实现

image_1_0 = cv2.transpose(image_1) # 矩阵的转置也可以凑合实现90旋转

旋转方式三:

可以使用cv2.rotate()函数实现 90 180 270 度旋转,也会避免第一种仿射变换后出现图像空缺区域的情况,参数选择改第二个参数即可:

image_1_0 = cv2.rotate(image_1, cv2.ROTATE_90_CLOCKWISE)

翻转:

镜像翻转图片,可以用 cv2.flip() 函数:

dst = cv2.flip(img, 1)

其中,参数 2 = 0 :垂直翻转 ( 沿 x 轴 ) ,参数 2 > 0: 水平翻转 ( 沿 y 轴 ) ,参数 2 < 0: 水平垂直翻转。

【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。