opencv 缩放 平移 旋转 仿射变换

opencv 缩放 平移 旋转 仿射变换

import numpy as np

import cv2
import matplotlib.pylab as plt
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为黑体
mpl.rcParams['axes.unicode_minus'] = False    # 正常显示负号

# 原图
img = cv2.imread("lena.jpeg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 缩小
img_dsize = cv2.resize(img, None, fx=1/2, fy=1/4)

# 平移
# 100 水平方向移动 50 垂直方向移动
M = np.float64([[1, 0, 100], [0, 1, 50]])
width, height = img.shape[:2]
img_move = cv2.warpAffine(img, M, (width, height))

# 旋转
width, height = img.shape[:2]
M = cv2.getRotationMatrix2D((width/2, width/2),  # 旋转中心 角度 缩放比例
                            45,  # 角度
                            1)   # 缩放比例
img_rotate = cv2.warpAffine(img, M, (width, height))

# 仿射变换 从一个二维坐标系变换到另一个二维坐标系,属于线性变换。通过已知3对坐标点可以求得变换矩阵。
# 在原图像和目标图像上各选择三个点
width, height = img.shape[:2]
mat_src = np.float32([[0, 0], [0, height-1], [width-1, 0]])
mat_dst = np.float32([[0, 0], [100, height-100], [width-100, 100]])

# 得到变换矩阵
M = cv2.getAffineTransform(mat_src, mat_dst)
# 进行仿射变换
img_tran = cv2.warpAffine(img, M, (width, height))


# 显示图像
# plt.subplot(nrows, ncols, index)
# 表示在当前画布的右上角创建一个1行3列的绘图区域,同时 选择在第 1 个位置绘制子图。
plt.subplot(1, 5, 1)
plt.xticks([]), plt.yticks([])  # 隐藏x和y轴
plt.imshow(img)
plt.title('原图')

plt.subplot(1, 5, 2)
plt.xticks([]), plt.yticks([])  # 隐藏x和y轴
# plt.imshow(blur, 'gray')
plt.imshow(img_dsize)
plt.title('缩小')

plt.subplot(1, 5, 3)
plt.xticks([]), plt.yticks([])  # 隐藏x和y轴
plt.imshow(img_move)
plt.title('平移')

plt.subplot(1, 5, 4)
plt.xticks([]), plt.yticks([])  # 隐藏x和y轴
plt.imshow(img_rotate)
plt.title('旋转')

plt.subplot(1, 5, 5)
plt.xticks([]), plt.yticks([])  # 隐藏x和y轴
plt.imshow(img_tran)
plt.title('仿射变换')
plt.show()

 

发表回复

您的电子邮箱地址不会被公开。