【DW打卡-计算机视觉基础】02_OpenCV的几何变换--旋转和平移

简介

"""
1、平移、旋转的原理
* 对于旋转和偏移,就需要3步(3次变换):
* 将输入原图图像坐标转换为笛卡尔坐标系;
* 进行旋转计算。旋转矩阵前面已经给出了;
* 将旋转后的图像的笛卡尔坐标转回图像坐标。
1.1 前向传播
前向映射就是根据原图用变换公式直接算出输出图像相应像素的空间位置,那么这会导致一个问题:可能会有多个像素坐标映射到输出图像的同一位置,也可能输出图像的某些位置完全没有相应的输入图像像素与它匹配,也就是没有被映射到,造成有规律的空洞(黑色的蜂窝状)。
1.2 反向映射
更好的一种方式是采用 反向映射(Inverse Mapping):扫描输出图像的位置(x,y),通过
Image
(为T的逆矩阵)计算输入图像对应的位置 (v,w),通过插值方法决定输出图像该位置的灰度值。
"""

简单实践

import cv2
import numpy as np

if __name__ == '__main__':
    print('基本的几何变换进行学习')
    img = cv2.imread('./00_dog.jpg', cv2.IMREAD_UNCHANGED)
    print('原始图像大小', img.shape)

    # 图像旋转
    rows, cols, _ = img.shape
    length = max(rows, cols)
    # 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
    # 可以通过设置旋转中心,缩放因子以及窗口大小来防止旋转后超出边界的问题
    M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.6)
    # cv2.warpAffine: 对图像进行仿射变换,一般进行平移或者旋转操作
    cv2.imshow("image", img)
    dst = cv2.warpAffine(img, M, (length, length), borderValue=(255, 255, 255))  # M为上面的旋转矩阵
    cv2.imshow("roate", dst)

    # 图像平移
    M = np.float32([
        [1, 0, 100], # 100为水平平移量
        [0, 1, 50] # 竖直平移量
    ])
    dst = cv2.warpAffine(img, M, (cols, rows))

    cv2.imshow('img', dst)
    cv2.waitKey(10000)
    cv2.destroyAllWindows()

输出

posted @ 2021-09-16 23:04  山枫叶纷飞  阅读(113)  评论(0编辑  收藏  举报