一、仿射变换 [图像预处理]
1、介绍
图像的仿射变换涉及到图像的形状位置角度的变化,是深度学习预处理中常用的功能,仿射变换主要是对图像的缩放、旋转、翻转和平移等操作的组合。注意:变换矩阵中是6个点,所以变换矩阵中一项就是一个坐标。
注意:图像的坐标,宽度是X方向,高度是Y方向
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from matplotlib import font_manager #中文显示字体设置
#设置字体的方式,fname指定为系统中可使用字体的路径
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/STHUPO.TTF")
#1、读取图像
img = cv.imread("./images/gyy.jpg")
#2、仿射变换
rows, cols = img.shape[:2]
#2.1创建变换矩阵
pst1 = np.float32([[50,50], [200,50], [50, 200]])
pst2 = np.float32([[100,100], [200,50], [100,250]])
M = cv.getAffineTransform(pst1, pst2)
#2.2完成仿射变换
dst = cv.warpAffine(img, M, (cols, rows))
#3、图像显示
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10,8), dpi=100)
axes[0].imshow(img[:,:,::-1]) #通道转换
axes[0].set_title("原图", fontproperties=my_font)
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("仿射后结果", fontproperties=my_font)
plt.show()
二、透射变换 [图像预处理]
透射变换是视角变化的结果,是指利用透射中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。
它的本质是将图像投影到一个新的视平面,其通用变换公式为:
在opencv中,我们要找到四个点,其中任意三个不共线,然后获取变换矩阵T,再进行透射变换,通过函数cv.getPerspectiveTransform找到变换矩阵,将cv.warpPerspective应用于此3x3变换矩阵
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from matplotlib import font_manager
#设置字体显示
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/STHUPO.TTF")
#1、读取图像
img = cv.imread("./images/gyy.jpg")
#2、透射变换
rows,cols = img.shape[:2]
#2.1创建变换矩阵
pst1 = np.float32([[56,65], [368,52], [28,387], [389,390]])
pst2 = np.float32([[100,145], [300,100], [80,290], [310,300]])
#2.2获取透视变换矩阵
T = cv.getPerspectiveTransform(pst1, pst2)
#2.3进行变换
dst = cv.warpPerspective(img, T, (cols, rows))
#3、图像显示
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10,8), dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图", fontproperties=my_font)
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("透射后结果", fontproperties=my_font)
plt.show()
三、图像金字塔
图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。
图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。
金字塔的底部是待处理的图像的高分辨率表示,而顶部是低分辨率的近似,层级越高,图像越小,分辨率越低。
1、API介绍
cv.pyrUp(img) | 对图像进行上采样 |
cv.pyrDown(img) | 对图像进行下采样 |
2、案例
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#1、读取图片
img = cv.imread("./images/box.png")
#2、进行图像采样
up_img = cv.pyrUp(img) #上采样操作
down_img = cv.pyrDown(img) #下采样操作
#3、图像显示
cv.imshow('enlarge', up_img)
cv.imshow('original', img)
cv.imshow('shrink', down_img)
cv.waitKey(0)
cv.destroyAllWindows()