07. 图像的翻转、旋转、仿射变换、透视变换

2022/6/23 23:22:39

本文主要是介绍07. 图像的翻转、旋转、仿射变换、透视变换,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

图像的翻转、旋转、仿射变换、透视变换

  • 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()


这篇关于07. 图像的翻转、旋转、仿射变换、透视变换的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程