OpenCV学习笔记:图像的几何变换

1. 缩放

cv2.resize(src, dsize, fx, fy, interpolation)

src:输入图像
dsize:(宽,高)
fx:按比例缩放时宽的系数
fy:按比例缩放时高的系数
interpolation:插值算法

interpolation 算法
cv2.INTER_NEAREST 最近邻插值
cv2.INTER_LINEAR 双线性插值
cv2.INTER_CUBIC 双三次插值
cv2.INTER_AREA(效果好) 像素区域重采样
def resize(img):
    cat_nearest = cv2.resize(img, (224, 224), interpolation=cv2.INTER_NEAREST)
    cat_linear = cv2.resize(img, (224, 224), interpolation=cv2.INTER_LINEAR)
    cat_cubic = cv2.resize(img, (224, 224), interpolation=cv2.INTER_CUBIC)
    cat_area = cv2.resize(img, (224, 224), interpolation=cv2.INTER_AREA)

    cv2.imshow('origin', img)
    cv2.imshow('Nearest', cat_nearest)
    cv2.imshow('Linear', cat_linear)
    cv2.imshow('Cubic', cat_cubic)
    cv2.imshow('Area', cat_area)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

在这里插入图片描述

2. 翻转

cv2.flip(src, flipCode, dst)
def flip(img):
    cat_x = cv2.flip(img, flipCode=0)
    cat_y = cv2.flip(img, flipCode=1)
    cat_x_y = cv2.flip(img, flipCode=-1)

    # BGR -> RGB
    cat_flip = [img[:, :, ::-1], cat_x[:, :, ::-1], cat_y[:, :, ::-1], cat_x_y[:, :, ::-1]]
    flip_type = ['origin', 'flipCode=0', 'flipCode=1', 'flipCode=-1']

    fig = plt.figure()
    for index in range(4):
        fig.add_subplot(2, 2, index+1)
        plt.imshow(cat_flip[index])
        plt.title(flip_type[index])
    plt.show()

flipCode
0 : 以x轴为对称轴翻转
大于0:以y轴为对称轴翻转
小于0:以x轴和y轴为对称轴翻转

在这里插入图片描述

3. 平移

cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
参数 意义
M 变换矩阵
dsize 输出图像尺寸
flags 插值方式
borderMode 边界像素模式
borderValue 边界填充值
def translation(img):
    transform_matrix = np.array([[1, 0, 100], [0, 1, 100]]).astype(np.float32)
    cat_translation_0 = cv2.warpAffine(img, transform_matrix, img.shape[::-1][1:], flags=cv2.INTER_AREA,
                                       borderValue=[0, 0, 0])

    cat_translation_255 = cv2.warpAffine(img, transform_matrix, img.shape[::-1][1:], flags=cv2.INTER_AREA,
                                         borderValue=[255, 255, 255])
    # BGR -> RGB
    cat_translation = [img[:, :, ::-1], cat_translation_0[:, :, ::-1], cat_translation_255[:, :, ::-1]]
    translation_type = ['origin', 'borderValue=[0, 0, 0]', 'borderValue=[255, 255, 255]']

    fig = plt.figure()
    for index in range(3):
        fig.add_subplot(1, 3, index + 1)
        plt.imshow(cat_translation[index])
        plt.title(translation_type[index])
    plt.tight_layout()
    plt.show()

在这里插入图片描述

4. 旋转

cv2.getRotationMatrix2D(center, angle, scale)  # 中心,角度,缩放
cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
def rotation(img):
    cols, rows = img.shape[1], img.shape[0]
    M = cv2.getRotationMatrix2D(center=(cols//2, rows//2), angle=90, scale=0.5)
    cat_rotation = cv2.warpAffine(img, M, dsize=(cols, rows))
    plt.figure()
    plt.subplot(121)
    plt.imshow(img[:, :, ::-1])
    plt.title('origin')
    plt.subplot(122)
    plt.imshow(cat_rotation[:, :, ::-1])
    plt.title('angle=90, scale=0.5')
    plt.show()

在这里插入图片描述

5. 仿射变换

cv2.getAffineTransform(src, dst)
cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
def affine_transform(img):
    cols, rows = img.shape[1], img.shape[0]
    pts1 = np.array([[50, 50], [200, 50], [50, 200]], dtype=np.float32)    
    pts2 = np.array([[100, 100], [200, 50], [100, 250]], dtype=np.float32)
    M = cv2.getAffineTransform(pts1, pts2)  # 三个点对求解变换矩阵
    cat_affine = cv2.warpAffine(img, M, (cols, rows))
    plt.figure()
    plt.subplot(121)
    plt.imshow(img[:, :, ::-1])
    plt.title('origin')
    plt.subplot(122)
    plt.imshow(cat_affine[:, :, ::-1])
    plt.title('affine')
    plt.show()

在这里插入图片描述

6. 透射变换

cv2.getPerspectiveTransform(src, dst)
cv2.warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
def perspective_transform(img):
    cols, rows = img.shape[1], img.shape[0]
    pts1 = np.array([[100, 100], [100, 500], [300, 100], [300, 500]], dtype=np.float32)
    pts2 = np.array([[200, 200], [200, 600], [450, 250], [450, 650]], dtype=np.float32)
    M = cv2.getPerspectiveTransform(pts1, pts2)
    print(M.shape)
    cat_affine = cv2.warpPerspective(img, M, (cols, rows))
    plt.figure()
    plt.subplot(121)
    plt.imshow(img[:, :, ::-1])
    plt.title('origin')
    plt.subplot(122)
    plt.imshow(cat_affine[:, :, ::-1])
    plt.title('perspective')
    plt.show()

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340