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

一、图像的缩放

OpenCv API:

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

参数:

  1. src:输入的图像
  2. dsize:绝对尺寸,直接将图像调整为指定大小
  3. fx, fy:相对尺寸,将dsize设置为None时,直接设置fx, fy为比例因子即可
  4. interpolation:插值方法
插值含义
cv2.INTER_LINEAR双线性插值法
cv2.INTER_NEAREST最近邻插值
cv2.INTER_AREA像素区域重采样(默认)
cv2.INTER_CUBIC双三次插值

代码编写

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

src = 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)

参数:

  1. src:输入的图像
  2. M:2*3的移动矩阵,格式为
    M = [ 1 0 t x 0 1 t y ] \begin{gathered} M= \begin{bmatrix} 1 & 0 & tx \\ 0 & 1 & ty \end{bmatrix} \quad \end{gathered} M=[1001txty]表示x方向移动tx,y方向移动ty
    注意: M应设置为np.float32类型的Numpy数组
  3. dsize:输出图像的大小
    注意: 输出图像的大小,应该是(宽度,高度)的形式,width=列数,height=行数

代码编写

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

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

src = 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)

参数:

  1. center:旋转中心
  2. angle:旋转角度
  3. scale:缩放比例
  4. M:旋转矩阵

代码编写

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

src = 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 np
import cv2 as cv
import matplotlib.pyplot as plt

src = 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 np
import cv2 as cv
import matplotlib.pyplot as plt

src = 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 np
import cv2 as cv
import matplotlib.pyplot as plt

src = 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()

在这里插入图片描述

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 缩放 缩放指的是将原始图像按比例缩小或放大。OpenCV中提供了resize()函数来实现缩放操作。 语法: dst = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) 参数说明: - src:原始图像。 - dsize:输出图像大小。 - fx:水平方向缩放比例。 - fy:垂直方向缩放比例。 - interpolation:插值方法。常用的有cv2.INTER_LINEAR(双线性插值)和cv2.INTER_NEAREST(最近邻插值)。 示例代码: import cv2 img = cv2.imread('lena.png') # 缩小图像 dst = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR) cv2.imshow('dst', dst) cv2.waitKey(0) cv2.destroyAllWindows() 2. 平移 平移指的是将原始图像沿着水平或垂直方向移动一定的距离。OpenCV中提供了warpAffine()函数来实现平移操作。 语法: dst = cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) 参数说明: - src:原始图像。 - M:变换矩阵,可以通过cv2.getAffineTransform()或cv2.getPerspectiveTransform()函数获取。 - dsize:输出图像大小。 - flags:插值方法和变换标志。常用的有cv2.INTER_LINEAR和cv2.WARP_FILL_OUTLIERS。 - borderMode:边界填充方法。常用的有cv2.BORDER_CONSTANT和cv2.BORDER_REPLICATE。 - borderValue:边界填充颜色。 示例代码: import cv2 import numpy as np img = cv2.imread('lena.png') rows, cols = img.shape[:2] # 定义平移矩阵 M = np.float32([[1, 0, 100], [0, 1, 50]]) # 平移图像 dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow('dst', dst) cv2.waitKey(0) cv2.destroyAllWindows() 3. 翻转 翻转指的是将原始图像沿着水平或垂直方向翻转。OpenCV中提供了flip()函数来实现翻转操作。 语法: dst = cv2.flip(src, flipCode[, dst]) 参数说明: - src:原始图像。 - flipCode:翻转方式。0表示沿x轴翻转(水平翻转),1表示沿y轴翻转(垂直翻转),-1表示沿x轴和y轴同时翻转(水平垂直翻转)。 示例代码: import cv2 img = cv2.imread('lena.png') # 水平翻转 dst1 = cv2.flip(img, 0) # 垂直翻转 dst2 = cv2.flip(img, 1) # 水平垂直翻转 dst3 = cv2.flip(img, -1) cv2.imshow('dst1', dst1) cv2.imshow('dst2', dst2) cv2.imshow('dst3', dst3) cv2.waitKey(0) cv2.destroyAllWindows()

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值