Python 图像处理OpenCV:几何变换(笔记)
创始人
2024-01-16 23:53:28
0

包括图像缩放、图像平移、图像旋转、图像的仿射变换、图像的透射变换及图像金字塔等内容。

图像缩放:

  • 缩放是对图像的大小进行调整,即使图像放大或缩小。
  • cv2.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR)
  • src : 输入图像
  • dsize: 绝对尺寸,直接指定调整后图像的大小
  • fx,fy: 相对尺寸,将dsize设置为None,然后将fx和fy设置为比例因子即可
  • interpolation:插值方法

图像平移:

  • 图像平移将图像按照指定方向和距离,移动到相应的位置。
  • cv.warpAffine(img,M,dsize)
  • img: 输入图像
  • M: 2*∗3移动矩阵
  • dsize: 输出图像的大小

图像旋转:

  • 图像旋转是指图像按照某个位置转动一定角度的过程,旋转中图像仍保持这原始尺寸。图像旋转后图像的水平对称轴、垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换。
  • 在OpenCV中图像旋转首先根据旋转角度和旋转中心获取旋转矩阵,然后根据旋转矩阵进行变换,即可实现任意角度和任意中心的旋转效果。
  • cv2.getRotationMatrix2D(center, angle, scale)
  • center:旋转中心
  • angle:旋转角度
  • scale:缩放比例
  • M:旋转矩阵
  • 调用cv.warpAffine完成图像的旋转

图像的仿射变换:

  • 图像的仿射变换涉及到图像的形状位置角度的变化,是深度学习预处理中常到的功能,仿射变换主要是对图像的缩放,旋转,翻转和平移等操作的组合。
  • 需要注意的是,对于图像而言,宽度方向是x,高度方向是y,坐标的顺序和图像像素对应下标一致。所以原点的位置不是左下角而是右上角,y的方向也不是向上,而是向下。
  • 在仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建这个矩阵我们需要从原图像中找到三个点以及他们在输出图像中的位置。然后cv2.getAffineTransform
    会创建一个 2x3 的矩阵,最后这个矩阵会被传给函数 cv2.warpAffine。

图像的透射变换:

  • 透射变换是视角变化的结果,是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。
  • 在opencv中,我们要找到四个点,其中任意三个不共线,然后获取变换矩阵T,再进行透射变换。通过函数cv.getPerspectiveTransform找到变换矩阵,将cv.warpPerspective应用于此3x3变换矩阵。

图像金字塔:

  • 图像金字塔是图像多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。

  • 图像金字塔用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。

  • 金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似,层级越高,图像越小,分辨率越低。

  • cv.pyrUp(img) #对图像进行上采样

  • cv.pyrDown(img) #对图像进行下采样

总结:

图像缩放:

  • 对图像进行放大或缩小 cv.resize()

图像平移:

  • 指定平移矩阵后,调用cv.warpAffine()平移图像

图像旋转:

  • 调用cv.getRotationMatrix2D获取旋转矩阵,然后调用cv.warpAffine()进行旋转

仿射变换:

  • 调用cv.getAffineTransform将创建变换矩阵,最后该矩阵将传递给cv.warpAffine()进行变换

透射变换:

  • 通过函数cv.getPerspectiveTransform()找到变换矩阵,将cv.warpPerspective()进行投射变换

金字塔:

  • 图像金字塔是图像多尺度表达的一种,使用的API:
  • cv.pyrUp(): 向上采样
  • cv.pyrDown(): 向下采样

代码如下:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
fengjing = cv.imread("./image/fengjing.jpg")
plt.imshow(fengjing[:, :, ::-1])
plt.show()
# 获取图像的绝对尺寸
rows, cols = fengjing.shape[:2]
print(rows)
print(cols)
'''对图像的大小进行调整,即图像的放大或缩小cv.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR)src:输入图像dsize:绝对尺寸,直接指定调整后图像的大小fx,fy:相对尺寸,将dsize设置为None,然后将fx和fy设置为比例因子即可。interpolation:插值方法
'''
# 调整绝对尺寸,放大
res = cv.resize(fengjing, (2*rows, 2*cols))
plt.imshow(res[:, :, ::-1])
plt.show()
print(res.shape)
# 调整相对尺寸,缩小
res1 = cv.resize(fengjing, None, fx=0.5, fy=0.5)
plt.imshow(res1[:, :, ::-1])
# 翻转是因为用cv读图像默认是的通道是BGR,用plt输出要RGB。
plt.show()
print(res1.shape)
'''平移cv.warpAffine(img,M,dsize)img: 输入图像M:2*3移动矩阵 注意:将M设置为np.float32类型的Numpy数组。dsize:输出图像的大小 注意:输出图像的大小,应该是(宽度,高度)的形式,请记住,width=列数,height=行数。
'''
# 平移
M = np.float32([[1, 0, 100], [0, 1, 50]])
res3 = cv.warpAffine(fengjing, M, (cols, rows))
plt.imshow(res3[:, :, ::-1])
plt.show()
'''旋转在OpenCV中图像旋转首先根据旋转角度和旋转中心获取旋转矩阵,然后根据旋转矩阵进行变换,即可实现任意角度和任意中心的旋转效果。cv2.getRotationMatrix2D(center, angle, scale)center:旋转中心angle:旋转角度scale:缩放比例返回 M:旋转矩阵而后调用cv.warpAffine完成图像的旋转
'''
# 旋转
# 获取旋转矩阵
M = cv.getRotationMatrix2D((cols/2, rows/2), 45, 1)
# 旋转中心指定为图像的中间位置,旋转45度,缩放比例为1,即不进行缩放。
res5 = cv.warpAffine(fengjing, M, (cols, rows))
plt.imshow(res5[:, :, ::-1])
plt.show()
'''仿射变换图像的仿射变换涉及到图像的形状位置角度的变化,是深度学习预处理中常到的功能,仿射变换主要是对图像的缩放,旋转,翻转和平移等操作的组合。那什么是图像的仿射变换,如下图所示,图1中的点1, 2 和 3 与图二中三个点一一映射, 仍然形成三角形, 但形状已经大大改变,通过这样两组三点(感兴趣点)求出仿射变换, 接下来我们就能把仿射变换应用到图像中所有的点中,就完成了图像的仿射变换。
'''
# 仿射变换
# 原始图像的位置
pta1 = np.float32([[50, 50], [190, 50], [50, 190]])
# 仿射图像的位置
pta2 = np.float32([[100, 100], [190, 50], [100, 260]])
# 构建变换矩阵
M = cv.getAffineTransform(pta1, pta2)
print(M)
res7 = cv.warpAffine(fengjing, M, (cols, rows))
plt.imshow(res7[:, :, ::-1])
plt.show()
'''透射变换透射变换是视角变化的结果,是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。
'''
# 投射变换
pst1 = np.float32([[56, 65], [368, 53], [28, 387], [389, 390]])
pst2 = np.float32([[100, 150], [300, 100], [80, 290], [310, 300]])
T = cv.getPerspectiveTransform(pst1, pst2)
print(T)
res9 = cv.warpPerspective(fengjing, T, (cols, rows))
plt.imshow(res9[:, :, ::-1])
plt.show()
'''图像金字塔图像金字塔是图像多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。图像金字塔用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似,层级越高,图像越小,分辨率越低。cv.pyrUp(img)       #对图像进行上采样cv.pyrDown(img)     #对图像进行下采样
'''
# 图像金字塔
# 上采样
imgup = cv.pyrUp(fengjing)
plt.imshow(imgup[:, :, ::-1])
plt.show()
imgup1 = cv.pyrUp(imgup)
plt.imshow(imgup1[:, :, ::-1])
plt.show()
# 下采样
imgdown = cv.pyrDown(fengjing)
plt.imshow(imgdown[:, :, ::-1])
plt.show()

输出结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


欢迎大家查看作者的主页,主页中还有关于编程与算法方面的更多内容,欢迎大家相互沟通学习~

相关内容

热门资讯

关于保险公司年会主持词 关于保险公司年会主持词  公司的类型有哪些  根据《中华人民共和国公司法》公司的主要形式为无限责任公...
在年会上的致辞 在年会上的致辞范文(精选5篇)  在平时的学习、工作或生活中,大家都写过致辞吧,致辞是指在举行会议或...
企业开工仪式致辞 企业开工仪式致辞(精选7篇)  在平时的学习、工作或生活中,大家都不可避免地会接触到致辞吧,致辞是指...
小学第二学期的开学典礼主持词 小学第二学期的开学典礼主持词  主持词已成为各种演出活动和集会中不可或缺的一部分。在当今中国社会,各...
升学宴主持词 升学宴主持词3篇  高考过后考生及家长需要考虑举办升学宴会酒席的事宜了,升学宴主持词怎么写?下面是小...
同学聚会致辞 同学聚会致辞(精选6篇)  在生活、工作和学习中,大家都尝试过写致辞吧,在各种重大的庆典、外交、纪念...
升学宴会主持词 升学宴会主持词9篇  主持人在台上表演的灵魂就表现在主持词中。在当今社会中,各种场合中活跃现场气氛的...
早会主持词 早会主持词范文4篇  早会能对一天或是一周亦或是一个月的工作作出及时的总结和临时性的调整,在工作中有...
服装展示主持词示例 服装展示主持词示例  篇一:服装展示串词  龙 蓓  1、现在出场的是宾馆总台接待,为大家作展示的是...
重阳节主持词 重阳节主持词(精选13篇)  主持词分为会议主持词、晚会主持词、活动主持词、婚庆主持词等。在人们越来...
商场活动主持词   商场活动主持词  亲爱的顾客朋友:  大家下午好!  “金猪报捷去,玉鼠送春来”。欢迎大家在这个...
主婚人简短婚礼致辞 主婚人简短婚礼致辞  结婚是件大事,那么主婚人如何向新人们致辞呢?怎么做致辞才简短又大气呢?下面我们...
六一儿童节活动主持词 六一儿童节活动主持词集锦  众所周知,六一儿童节是孩子们开心玩耍的节日。小编今天为大家带来六一儿童节...
公司会抽奖环节主持词 公司会抽奖环节主持词  根据活动对象的不同,需要设置不同的主持词。在现在的社会生活中,司仪等是很多场...
迎新年晚会主持词 2022迎新年晚会主持词例文(精选11篇)  过去的一年,对于我们每一个中国人来说都是难忘的一年,我...
女儿出嫁父亲婚礼致辞 女儿出嫁父亲婚礼致辞范文(通用13篇)  无论是在学校还是在社会中,大家总少不了要接触或使用致辞吧,...
结婚当天新娘的致辞 结婚当天新娘的致辞(精选8篇)  新人致辞是婚礼上不可缺少的重要环节,那么如何表达能 显得既大方得体...
毕业典礼主持词 毕业典礼主持词(合集15篇)  主持人在台上表演的灵魂就表现在主持词中。在当今不断发展的世界,主持成...
新婚回门的宴会主持词 新婚回门的宴会主持词尊敬的各位来宾:  大家好!  今天是20XX年2月13日,农历:乙卯年正月十一...
春季订货会的主持词 春季订货会的主持词各位领导、各位经理、来宾、朋友们:  今天我们相聚在这里,共同迎来了四海商贸公司的...