图像的翻转、旋转、仿射变换、透视变换
- flip 翻转操作,flipCode=0上下翻转,>0左右翻转,<0上下+左右翻转
- rotate 旋转操作,只能三种旋转方式,以cv2.ROTATE_开头
- warpAffine 仿射变换是图像旋转,缩放,平移的总称,具体的做法是通过一个矩阵和原图片坐标进行计算,得到新的坐标,完成变换,关键在于矩阵M,注意该矩阵会参与计算,要求类型为float, 如np.float32([[1, 0, tx], [0, 1, ty]])进行平移操作
- getRotationMatrix2D 得到仿射变换矩阵M,仿射变换的难点就在于计算仿射矩阵M,通过该工具可以快速得到矩阵M,对于仿射变换,矩阵M是2*3的
- warpPerspective 透视变换,对于透视变换,矩阵M是3*3的
- getPerspectiveTransform 获取透视变换的变换矩阵,需要4个对应的点
示例一:透视变换,自己手机拍照,将其达到扫描全能王的操作一样;
import cv2
import numpy as np
bg = cv2.imread('./images/1655271474337.jpg')
print(bg.shape) # (3472, 4624, 3) 大概3:4
# def mouse_callback(event, x, y, flags, userdata):
# if event == cv2.EVENT_LBUTTONDOWN:
# print("坐标:", x, ", ", y)
# 绘制背景色
window_name = 'window'
cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)
cv2.resizeWindow(window_name, (800, 600))
cv2.imshow(window_name, bg)
# 这个添加鼠标的回调是为了通过鼠标来确定图片所在位置,得到的是点在图片中的像素坐标,与窗口被缩放了没有关系
# cv2.setMouseCallback(window_name, mouse_callback)
# 这里要特别注意,要参与计算,是float32,不然会报错
coords = np.float32([[254, 393], [4300, 500], [236, 2702], [4259, 2708]])
coords2 = np.float32([[0, 0], [800, 0], [0, 600], [800, 600]])
M = cv2.getPerspectiveTransform(coords, coords2)
bg2 = cv2.warpPerspective(bg, M, (800, 600))
cv2.imshow("bg2", bg2)
cv2.waitKey(0)
cv2.destroyAllWindows()
示例二:结合前面对窗口的操作,实现动态选择4个点来达到9-1的效果;将作业进行了修改:叠加水印
import cv2 as cv
import numpy as np
bg = cv.imread('./images/bg.jpg')
logo = cv.imread('./images/burn.png')
print(bg.shape)
print(logo.shape)
bg_section = bg[0:128, 0:128, :]
# 叠加水印,logo的透明度0~1之间
alpha = 0.3
bg_section = bg_section*(1-alpha) + logo*alpha
bg[0:128, 0:128, :] = bg_section
cv.namedWindow('image', cv.WINDOW_NORMAL)
cv.resizeWindow('image', 800, 600)
cv.imshow('image', bg)
cv.waitKey(0)
cv.destroyAllWindows()