1.4 Python图像的坐标变换-仿射变换

1.4 Python图像的坐标变换-仿射变换

文章目录

  • 1.4 Python图像的坐标变换-仿射变换
    • 1 算法原理
    • 2 代码
    • 3 效果

1 算法原理

图像的几何变换,也就是矩阵乘法。

通过仿射变换将图片中的每个像素点按照一定的规律映射到新的位置,仿射变换可以由一个矩阵A和一个向量B给出:

1.4 Python图像的坐标变换-仿射变换_第1张图片

原像素点坐标(x,y),经过仿射变换后的点的坐标是T(u,v),则矩阵仿射变换基本算法原理:

1.4 Python图像的坐标变换-仿射变换_第2张图片

齐次坐标矩阵表示形式为:

1.4 Python图像的坐标变换-仿射变换_第3张图片

2 代码

运行代码说明

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()  # 显示图片

3 效果

1.4 Python图像的坐标变换-仿射变换_第4张图片

1.4 Python图像的坐标变换-仿射变换_第5张图片

1.4 Python图像的坐标变换-仿射变换_第6张图片

你可能感兴趣的:(python图像处理,python,opencv,计算机视觉)