700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > python+OpenCv笔记(六):图像的几何变换(缩放 平移 旋转 仿射 透射 金字塔)

python+OpenCv笔记(六):图像的几何变换(缩放 平移 旋转 仿射 透射 金字塔)

时间:2020-07-27 20:56:36

相关推荐

python+OpenCv笔记(六):图像的几何变换(缩放 平移 旋转 仿射 透射 金字塔)

一、图像的缩放

OpenCv API:

cv2.resize(src, dsize, fx, fy, interpolation)

参数:

src:输入的图像dsize:绝对尺寸,直接将图像调整为指定大小fx, fy:相对尺寸,将dsize设置为None时,直接设置fx, fy为比例因子即可interpolation:插值方法

代码编写

import numpy as npimport cv2 as cvimport matplotlib.pyplot as pltsrc = cv.imread("E:\\qi.png")img = src.copy()# 绝对尺寸rows, cols = img.shape[:2]res = cv.resize(img, (cols * 2, rows * 2))# 相对尺寸res1 = cv.resize(img, None, fx=0.5, fy=0.5)# 显示图像fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(10, 8), dpi=100)axes[0].imshow(img[:, :, ::-1])axes[0].set_title("原图")axes[1].imshow(res[:, :, ::-1])axes[1].set_title("绝对尺寸")axes[2].imshow(res1[:, :, ::-1])axes[2].set_title("相对尺寸")plt.show()

二、图像的平移

OpenCv API:

cv2.warpAffine(src, M, dsize)

参数:

src:输入的图像M:2*3的移动矩阵,格式为

M=[10tx01ty]\begin{gathered} M= \begin{bmatrix} 1 & 0 & tx \\ 0 & 1 & ty \end{bmatrix} \quad \end{gathered} M=[10​01​txty​]​表示x方向移动tx,y方向移动ty

注意:M应设置为np.float32类型的Numpy数组dsize:输出图像的大小

注意:输出图像的大小,应该是(宽度,高度)的形式,width=列数,height=行数

代码编写

例如:将图像移动(50,100)的距离

import numpy as npimport cv2 as cvimport matplotlib.pyplot as pltsrc = cv.imread("E:\\qi.png")img = src.copy()# 平移图像rows, cols = img.shape[:2]M = np.float32([[1, 0, 100], [0, 1, 50]])dst = cv.warpAffine(img, M, (cols, rows))dst2 = cv.warpAffine(img, M, (cols*2, rows*2))# 显示图像fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(10, 8), dpi=100)axes[0].imshow(img[:, :, ::-1])axes[0].set_title("原图")axes[1].imshow(dst[:, :, ::-1])axes[1].set_title("平移(50,100)")axes[2].imshow(dst2[:, :, ::-1])axes[2].set_title("平移(50,100),画布扩大2倍")plt.show()

三、图像旋转

OpenCv API:

M = cv2.getRotationMatrix2D(center, angle, scale)dst = cv2.warpAffine(src, M, dsize)

参数:

center:旋转中心angle:旋转角度scale:缩放比例M:旋转矩阵

代码编写

import numpy as npimport cv2 as cvimport matplotlib.pyplot as pltsrc = cv.imread("E:\\qi.png")img = src.copy()# 旋转图像M = cv.getRotationMatrix2D((cols/2, rows/2), 90, 1)dst_rotate = cv.warpAffine(img, M, (cols, rows))M = cv.getRotationMatrix2D((cols/2, rows/2), 45, 0.5)dst_rotate2 = cv.warpAffine(img, M, (cols, rows))# 显示图像fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(10, 8), dpi=100)axes[0].imshow(img[:, :, ::-1])axes[0].set_title("原图")axes[1].imshow(dst_rotate[:, :, ::-1])axes[1].set_title("以中心旋转90度")axes[2].imshow(dst_rotate2[:, :, ::-1])axes[2].set_title("以中心旋转45度,并缩小1/2")plt.show()

四、仿射变换

OpenCv API:

M = cv2.getAffineTransform(src, dst)img = cv2.warpAffine(src, M, dsize)

代码编写

import numpy as npimport cv2 as cvimport matplotlib.pyplot as pltsrc = cv.imread("E:\\qi.png")img = src.copy()# 仿射变换pts1 = np.float32([[50, 50], [200, 50], [50, 200]])pts2 = np.float32([[100, 100], [200, 50], [100, 250]])M = cv.getAffineTransform(pts1, pts2)dst_affine = cv.warpAffine(img, M, (cols, rows))# 显示图像fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)axes[0].imshow(img[:, :, ::-1])axes[0].set_title("原图")axes[1].imshow(dst_affine[:, :, ::-1])axes[1].set_title("仿射变换")plt.show()

五、透射变换

OpenCv API:

M = cv2.getPerspectiveTransform(src, dst)img = cv2.warpPerspective(src, M, dsize)

代码编写

import numpy as npimport cv2 as cvimport matplotlib.pyplot as pltsrc = cv.imread("E:\\qi.png")img = src.copy()# 透射变换pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])pts2 = np.float32([[100, 145], [300, 100], [80, 290], [310, 300]])M = cv.getPerspectiveTransform(pts1, pts2)dst_perspective = cv.warpPerspective(img, M, (cols, rows))# 显示图像fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)axes[0].imshow(img[:, :, ::-1])axes[0].set_title("原图")axes[1].imshow(dst_perspective[:, :, ::-1])axes[1].set_title("透射变换")plt.show()

六、图像金字塔

图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。

OpenCv API:

cv2.pyrUp(src) # 上采样操作cv2.pyrDown(src) # 下采样操作

代码编写

import numpy as npimport cv2 as cvimport matplotlib.pyplot as pltsrc = cv.imread("E:\\qi.png")img = src.copy()# 图像金字塔up_img = cv.pyrUp(img)down_img = cv.pyrDown(img)# 显示图像cv.imshow("source", img)cv.imshow("up_img", up_img)cv.imshow("down_img", down_img)cv.waitKey(0)cv.destroyAllWindows()

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