Python+opencv:(4)图像的几何变换

(4)图像的几何变换

import cv2                              # opencv读取的格式是BGR
# import matplotlib.pyplot as plt         # Matplotlib是RGB
import numpy as np
import time

# .........................缩放............................
# 1.dsize参数实现缩放
img = cv2.imread('1.jpeg')
dst1 = cv2.resize(img, (100, 100))  # 缩小
dst2 = cv2.resize(img, (900, 900))  # 放大

# cv2.imshow('dst1', dst1)
# cv2.imshow('dst2', dst2)

# 2.fx和fy参数实现缩放
# 新图像宽度 = round(fx × 原图像宽度)
# 新图像高度 = round(fy × 原图像高度)
# dsize参数值必须使用None,否则fx和fy失效。
dst3 = cv2.resize(img, None, fx=1/3, fy=1/2)
dst4 = cv2.resize(img, None, fx=3, fy=2)

# cv2.imshow('dst3', dst3)
# cv2.imshow('dst4', dst4)


# .........................翻转............................
# flip:改变,快速翻动
dst5 = cv2.flip(img, 0)  # 沿x轴翻转
dst6 = cv2.flip(img, 1)  # 沿y轴翻转
dst7 = cv2.flip(img, -1)  # 同时沿x轴和y轴翻转

# cv2.imshow('img', img)
# cv2.imshow('dst5', dst5)
# cv2.imshow('dst6', dst6)
# cv2.imshow('dst7', dst7)


# .........................仿射变换............................
# 仿射矩阵M = [[a, b, c],[d, e, f]]
# 新x = 原x × a + 原y × b + c
# 新y = 原x × d + 原y × e + f

# 1.平移
# M = [[1, 0, 水平移动的距离],[0, 1, 垂直移动的距离]]
# 新x = 原x × 1 + 原y × 0 + 水平移动的距离 = 原x + 水平移动的距离
# 新y = 原x × 0 + 原y × 1 + 垂直移动的距离 = 原y + 垂直移动的距离

rows = len(img)  # 像素行数,len函数特定用法
cols = len(img[0])  # 像素列数,len函数特定用法
# M = np.float32([[1, 0, 50], [0, 1, 100]])  # 图像向右移动50像素、向下移动100像素
# M = np.float32([[1, 0, 0], [0, 1, -50]])  # 横坐标不变 纵坐标向上移动50像素
M = np.float32([[1, 0, -200], [0, 1, 0]])  # 横坐标向左移动200像素 纵坐标不变
dst8 = cv2.warpAffine(img, M, (cols, rows))
# cv2.imshow('dst8', dst8)


# 2.旋转
center = (rows/2, cols/2)  # 图像的中心点
M = cv2.getRotationMatrix2D(center, 30, 0.8)  # 以图像为中心,逆时针旋转30度,缩放0.8倍
dst9 = cv2.warpAffine(img, M, (cols, rows))
# cv2.imshow('dst9', dst9)


# 3.倾斜
p1 = np.zeros((3, 2), np.float32)   # 32位浮点型空列表,原图三个点
p1[0] = [0, 0]  # 左上角坐标
p1[1] = [cols - 1, 0]  # 右上角坐标
p1[2] = [0, rows - 1]  # 左下角坐标
p2 = np.zeros((3, 2), np.float32)   # 32位浮点型空列表,倾斜图三个点
# # 右倾斜
# p2[0] = [50, 0]  # 左上角坐标,右移50像素
# p2[1] = [cols - 1, 0]  # 右上角坐标,位置不变
# p2[2] = [0, rows - 1]  # 左下角坐标,位置不变
# # 左倾斜
p2[0] = [0, 0]  # 左上角坐标,位置不变
p2[1] = [cols - 1 - 50, 0]  # 右上角坐标,左移50像素
p2[2] = [50, rows - 1]  # 左下角坐标,右移50像素
M = cv2.getAffineTransform(p1, p2)  # 根据三个点的变化计算出M矩
dst10 = cv2.warpAffine(img, M, (cols, rows))
# cv2.imshow('dst10', dst10)


# 3.透视
# 模拟从底部观察图像得到的透视效果,将图像顶部边缘收窄,底部边缘保持不变
p1 = np.zeros((4, 2), np.float32)   # 32位浮点型空列表,原图4个点
p1[0] = [0, 0]  # 左上角坐标
p1[1] = [cols - 1, 0]  # 右上角坐标
p1[2] = [0, rows - 1]  # 左下角坐标
p1[3] = [cols - 1, rows - 1]  # 右下角坐标
p2 = np.zeros((4, 2), np.float32)   # 32位浮点型空列表,倾斜图三个点
p2[0] = [90, 0]  # 左上角坐标,右移90像素
p2[1] = [cols - 90, 0]  # 右上角坐标,左移90像素
p2[2] = [0, rows - 1]  # 右下角坐标,位置不变
p2[3] = [cols - 1, rows - 1]  # 右上角坐标,位置不变
M = cv2.getPerspectiveTransform(p1, p2)  # 根据4个点的变化计算出M矩
dst11 = cv2.warpPerspective(img, M, (cols, rows))
# cv2.imshow('dst11', dst11)





cv2.waitKey()
cv2.destroyAllWindows()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值