几何变换
openCV中读入的图像数据是以(h,w,c)的顺序构建数据的。并且数据的类型都为uint8.通道顺序为BGR!!!
import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline
def cvshow(name, image):
cv2.imshow(name, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
缩放
dst = cv2.resize( src, dsize[, fx[, fy[, interpolation]]] )
- dst代表输出的目标图像,该图像的类型与 src 相同,其大小为 dsize(当该值非零时),或者可以通过 src.size()、fx、fy 计算得到。
- src代表需要缩放的原始图像
- dsize 代表输出图像大小
- fx 代表水平方向的缩放比例
- fy 代表垂直方向的缩放比例
- interpolation 代表插值方式,如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zFq4UUAc-1650529848601)(attachment:image-2.png)]
cv2.resize()函数中,目标图像的大小可以通过“参数 dsize”或者“参数 fx 和 fy”二者之一来指定
- 情况 1:通过参数 dsize 指定:如果指定参数 dsize 的值,则无论是否指定了参数 fx 和 fy 的值,都由参数 dsize 来决定目标图像的大小。dsize 内第 1 个参数对应缩放后图像的宽度(width,即列数 cols,与参数 fx 相关),第 2 个参数对应缩放后图像的高度(height,即行数 rows,与参数 fy 相关)
- 情况 2:通过参数 fx 和 fy 指定:只需要指定缩放比例
lena = cv2.imread("lena.jpg")
print(lena.shape)
tar = cv2.resize(lena, dsize=None, fx=2, fy=0.5)
cvshow("tar", tar)
print(tar.shape)
(263, 263, 3)
(132, 526, 3)
可以看出,fx对列数变换,fy对行数变换
翻转
OpenCV 中,图像的翻转采用函数 cv2.flip()实现,该函数能够实现图像在水平方向翻转、垂直方向翻转、两个方向同时翻转:
- dst = cv2.flip( src, flipCode )
- dst 代表和原始图像具有同样大小、类型的目标图像
- src 代表要处理的原始图像
- flipCode 代表旋转类型
x = cv2.flip(lena, -1)
cvshow("x", x)
仿射变换
仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作
dst = cv2.warpAffine( src, M, dsize[, flags[, borderMode[, borderValue]]] )
- dst 代表仿射后的输出图像,该图像的类型和原始图像的类型相同。dsize 决定输出图像的实际大小
- src 代表要仿射的原始图像
- M 代表一个 2×3 的变换矩阵。使用不同的变换矩阵,就可以实现不同的仿射变换
- dsize 代表输出图像的尺寸大小
- flags 代表插值方法,默认为 INTER_LINEAR
- borderMode 代表边类型, 默认为 BORDER_CONSTANT 。 当 该值为 BORDER_TRANSPARENT 时,意味着目标图像内的值不做改变,这些值对应原始图像内的异常
值 - borderValue 代表边界值,默认是 0
忽略其可选参数后的语法格式为:dst = cv2.warpAffine( src , M , dsize )
平移
通过转换矩阵 M 实现将原始图像 src 转换为目标图像 dst:
- dst(𝑥, 𝑦) = src(𝑀11𝑥 + 𝑀12𝑦 + 𝑀13, 𝑀21𝑥 + 𝑀22𝑦 + 𝑀23)
将原始图像 src 向右侧移动 100 个像素、向下方移动 200 个像素,则其对应关系为:dst (x, y) = src (x + 100, y + 200) 即:
- dst (x, y) = src (1·x + 0·y + 100, 0·x + 1·y + 200)
所以:M11=1,M12=0,M13=100,M21=0,M22=1,M23=200
height, width = lena.shape[:2]
M = np.array([[1, 0, 50], [0, 1, 100]], np.float32)
res = cv2.warpAffine(lena, M, (height, width))
res.shape
con = np.hstack((lena, res))
cvshow("con", con)
旋转
在使用函数 cv2.warpAffine()对图像进行旋转时,可以通过函数 cv2.getRotationMatrix2D()获取转换矩阵。
retval=cv2.getRotationMatrix2D(center, angle, scale)
- center 为旋转的中心点
- angle 为旋转角度,正数表示逆时针旋转,负数表示顺时针旋转
- scale 为变换尺度(缩放大小)
height, width = lena.shape[:2]
matrix = cv2.getRotationMatrix2D((height/2, width/2), 45, 0.88)
res = cv2.warpAffine(lena, matrix, (height, width))
wer = np.hstack((lena, res))
cvshow("wer", wer)
更复杂的仿射变换
对于更复杂仿射变换,OpenCV 提供了函数 cv2.getAffineTransform()来生成仿射函数 cv2.warpAffine()所使用的转换矩阵 M
retval=cv2.getAffineTransform(src, dst)
- src 代表输入图像的三个点坐标
- dst 代表输出图像的三个点坐标
在该函数中,其参数值 src 和 dst 是包含三个二维数组(x, y)点的数组。上述参数通过函数cv2.getAffineTransform()定义了两个平行四边形。src 和 dst 中的三个点分别对应平行四边形的左上角、右上角、左下角三个点。函数 cv2.warpAffine()以函数 cv2.getAffineTransform()获取的转换矩阵 M 为参数,将 src 中的点仿射到 dst 中。函数 cv2.getAffineTransform()对所指定的点完成映射后,将所有其他点的映射关系按照指定点的关系计算确定。