图像的几何变换,也就是矩阵乘法。
通过仿射变换将图片中的每个像素点按照一定的规律映射到新的位置,仿射变换可以由一个矩阵A和一个向量B给出:
原像素点坐标(x,y),经过仿射变换后的点的坐标是T(u,v),则矩阵仿射变换基本算法原理:
齐次坐标矩阵表示形式为:
运行代码说明
1.要改变代码中的地址,我的地址说明,我是把待处理图片统一放在一个(同级)image文件夹,用os.listdir(base)读取图片名称列表,base是存放图片文件夹的相对路径,也可以是绝对路径
最后在
os.path.join(base,path)
代码中合并base和图片名称,得到完整图片地址2.如果想更改为读取同目录下图片,可以将读取图片路径的几句代码可以改为
原来
base = r'../image' paths = os.listdir(base) for path in paths: img = cv.imread(os.path.join(base,path), 1)
改为
paths = ['img1.jpg','img2.jpg','img3.png'......] for path in paths: print(path) # 读取图片 1 是加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。 img = cv.imread(path, 1)
3.注意最后的
plt.savefig('1.new' + path)
是保存plt图像,如果不使用可以注释掉
import os
import numpy as np
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
base = r'../image' # 注意,我是通过循环一次性处理3张图片的
paths = os.listdir(base)
for path in paths:
img = cv2.imread(os.path.join(base,path), 1)
height, width = img.shape[:2] # 405x413
# 在原图像和目标图像上各选择三个点
matSrc = np.float32([[0, 0],[0, height-10],[width-1, 0]])
matDst = np.float32([[0, 0],[90, height-90],[width-30, 30]])
# 得到变换矩阵
matAffine = cv2.getAffineTransform(matSrc, matDst)
# 进行仿射变换
dst = cv2.warpAffine(img, matAffine, (width,height))
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax1.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax1.set_title('原图')
ax2 = fig.add_subplot(122)
ax2.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))
ax2.set_title('仿射变换')
# plt.savefig('4.new' + path)
plt.show() # 显示图片