以上操作将会涉及仿射变换函数:
cv2.warpAffine(src, M, dsize, flags, borderMode, borderValue)
参数说明:
- src:输入图像
- M:仿射变换矩阵
- dsize:输出图像的大小
- flags:插值方式的组合(int类型!)
- borderMode:边界像素模型(int类型!)
- borderValue:(重点!)边界填充值;默认情况下为0。
flags:插值方式
- cv2.INTER_LINEAR,表示线性插值
- cv2.INTER_NEAREST,最近邻插值
- cv2.INTER_AREA,区域插值
- cv2.INTER_CUBIC,三次样条插值 4x4像素邻域
- cv2.INTER_LANCZOS4,lanczsos插值 8x8像素邻域
一、图像平移
import cv2
import numpy as np
img = cv2.imread("katong.jpeg", cv2.IMREAD_UNCHANGED)
rows, cols = img.shape[:2]
print(img.shape)
print(rows, cols)
# 在x轴方向移动多少(50)距离,在y轴方向移动多少(25)距离
H = np.float32([[1, 0, 50], [0, 1, 25]])
res = cv2.warpAffine(img, H, (cols, rows)) # 注意cols和rows的位置发生了变化
cv2.imshow("origin_picture", img)
cv2.imshow("new_picture", res)
cv2.waitKey(0)
cv2.destroyWindow()
二、图像缩放
主要涉及上采样和下采样,其中上采样是放大图片,目的是为了获得更高的分辨率;降采样时缩小分辨率。
涉及函数:
cv2.resize(src, dsize=None, fx, fy, interpolation)
- src:原图
- dsize:输出图像尺寸,与比例因子二选一
- fx:沿水平轴的比例因子
- fy:沿垂直轴的比例因子
- interpolation:插值方式【不同的插值方式对图像的影响不同】
import cv2
import numpy as np
img = cv2.imread("katong.jpeg",cv2.IMREAD_UNCHANGED)
height, width = img.shape[:2]
res1 = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR)
res2 = cv2.resize(img,(int(0.8*width),(int(0.8*height))), interpolation=cv2.INTER_AREA)
cv2.imshow("origin_picture",img)
cv2.imshow("res1",res1)
cv2.imshow("res2", res2)
cv2.waitKey()
cv2.destroyAllWindows()
三、图像旋转
简单的理解就是将图像中所有的像素点都旋转一个相同的角度。
旋转后得到的变换矩阵,然后将变换矩阵传入warpAffine中。
涉及的函数:
cv2.getRotationMatrix2D(center, angle, scale)
参数说明:
- center:图片的旋转中心
- angle:旋转角度
- scale:缩放比例,0.5表示缩小一半
- 正为逆时针,负为顺时针。
import cv2
import numpy as np
img = cv2.imread("katong.jpeg", cv2.IMREAD_UNCHANGED)
rows, clos = img.shape[:2]
# 参数1:旋转中心,参数2:旋转角度,参数3:缩放因子
# #参数3正为逆时针,负值为正时针
M = cv2.getRotationMatrix2D((rows / 2, clos / 2), 45, 1) # 返回变换矩阵
res = cv2.warpAffine(img, M, (rows, clos)) # 待处理图像+处理矩阵+输出大小
while (1):
cv2.imshow("img", img)
cv2.imshow('res', res)
if cv2.waitKey(0) & 0xFF == 27:
break
cv2.destroyAllWindows()
注意:旋转后的图像大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像。
四、仿射变换
仿射变换:平移、旋转、缩放、裁剪、反射。
涉及函数:
getAffineTransform(pos1,pos2)
- pos1:表示变换前的位置
- pos2:表示变换后的位置
import cv2
import numpy as np
img = cv2.imread("katong.jpeg",cv2.IMREAD_UNCHANGED)
rows, cols = img.shape[:2]
# 设置图像仿射变换矩阵
pos1 = np.float32([[50,50],[200,50],[50,200]])
pos2 = np.float32([[10,100],[200,50],[100,250]])
# 图像仿射变化,返回变换矩阵
M = cv2.getAffineTransform(pos1,pos2)
# 图像仿射变化
res = cv2.warpAffine(img,M,(cols,rows))
# 显示图像
cv2.imshow("original",img)
cv2.imshow("result", res)
cv2.waitKey(0)
cv2.destroyAllWindows()
五、透视变换
本质上就是将图像投影到一个新的视平面。
涉及函数:
cv2.getPerspectiveTransform(pos1, pos2)
- pos1:表示透视变换前的4个点对应的位置
- pos2:表示透视变换后的4个点对应的位置
cv2.warpPerspective(src, M, (clos, rows))
- src:表示原始图像
- M:表示透视变换矩阵
- (rows,cols)表示变换后的图像大小,rows表示行数,cols表示列数。
import cv2
import numpy as np
img = cv2.imread("katong.jpeg", cv2.IMREAD_UNCHANGED)
rows, clos = img.shape[:2]
# print(rows, clos)
# 设置图像透视变化矩阵
pos1 = np.float32([[114, 82], [287, 156], [8, 100], [143, 177]])
pos2 = np.float32([[0, 0], [188, 0], [0, 262], [188, 262]])
# 将图像投影到一个新的视平面 ===> 返回变化矩阵
M = cv2.getPerspectiveTransform(pos1, pos2)
# 推向透视变换
result = cv2.warpPerspective(img, M, (clos, rows))
cv2.imshow("original", img)
cv2.imshow("res", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
综合案列:数据扩展===>数据增强
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图片
img = cv2.imread("katong.jpeg", cv2.IMREAD_UNCHANGED)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 图像平移
M = np.float32([[1, 0, 80], [0, 1, 30]])
rows, cols, channel = img.shape
img1 = cv2.warpAffine(img, M, (cols, rows))
# 图像缩小
img2 = cv2.resize(img, (200, 200))
# 图像放大
img3 = cv2.resize(img, None, fx=1.1, fy=1.1)
# 绕图像的中心旋转
rows, cols, channel = img.shape
# 函数参数:旋转中心、旋转角度、尺寸
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 30, 1)
# 参数说明:图像、变化矩阵、输出大小
img4 = cv2.warpAffine(img, M, (cols, rows))
# 图像翻转:参数=0以X轴为对称轴翻转;参数=1以Y轴为对称轴翻转
img5 = cv2.flip(img, 0)
img6 = cv2.flip(img, 1)
# 图像仿射变化
pos1 = np.float32([[50, 50], [200, 50], [50, 200]])
pos2 = np.float32([[10, 100], [200, 50], [100, 250]])
M = cv2.getAffineTransform(pos1, pos2)
img7 = cv2.warpAffine(img, M, (rows, cols))
# 图像透射
pos1 = np.float32([[56, 65], [238, 52], [28, 237], [239, 240]])
pos2 = np.float32([[0, 0], [200, 0], [0, 200], [200, 200]])
M = cv2.getPerspectiveTransform(pos1, pos2)
img8 = cv2.warpPerspective(img, M, (200, 200))
# 循环显示
titles = ['source', 'shift', 'reduction', 'enlarge', 'rotation', 'flipX', 'flipY', 'affine', 'transmission']
images = [img, img1, img2, img3, img4, img5, img6, img7, img8]
for i in range(9):
plt.subplot(3, 3, i + 1) # 3x3的方格中的第i个图
plt.imshow(images[i])
plt.title(titles[i])
plt.xticks([]), plt.yticks([]) # 隐藏刻度
plt.show()
pytorch中的数据增强:https://blog.csdn.net/MasterCayman/article/details/118557776