OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)(python为工具) 【Open_CV系列(五)】

文章目录

ʚʕ̯•͡˔•̯᷅ʔɞ
🍹 欢迎各路大佬来到小啾主页指点☀️欢迎大家前来学习OpenCV图像几何变换专题 – Open_CV系列博文第五篇,我是侯小啾。
本期blog可以作为日常复制的脚手架代码来运用。
博客主页:云雀编程小窝 🌹꧔ꦿ
🌹꧔ꦿ博文内容如对您有所帮助,还请给个 点赞 + 关注 + 收藏

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】

如有疑问欢迎随时在评论区交流。☀️

; 准备图片

选择一张shape为(500,500,3)的梵高的《星月夜》以便示例。

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】
  1. 缩放 cv2.resize()方法

cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)

  • src 原图(的数组)
  • dsize: 输出图像的大小 格式:(a,b)。
    设定dsize后就无需再设置fx和fy
  • fx 可选参数 水平方向缩放比
  • fy 可选参数 垂直方向缩放比

fx和fy不同于dsize,fx和fy是各是一个比值,如设为2,则表示放大2倍,设为1/2则表示缩小到原来的1 2 \displaystyle \frac{1}{2}2 1 ​。

import cv2
img = cv2.imread("The_Starry_Night.jpg")

dst1 = cv2.resize(img, (200, 200))
dst2 = cv2.resize(img, (900, 900))
cv2.imshow("img", img)
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.waitKey()
cv2.destroyAllWindows()

执行结果如图所示,相比原图,图像得到了指定大小的缩小与放大。

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】

使用fx和fy参数,则 需要手动把dsize设为None

import cv2
img = cv2.imread("The_Starry_Night.jpg")

dst3 = cv2.resize(img, None, fx=1 / 3, fy=1 / 2)

dst4 = cv2.resize(img, None, fx=2, fy=2)
cv2.imshow("img", img)
cv2.imshow("dst3", dst3)
cv2.imshow("dst4", dst4)
cv2.waitKey()
cv2.destroyAllWindows()

结果呈现:

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】
  1. 翻转 cv2.flip()方法

flip(src, flipCode, dst=None)

  • src 图像(数组)
  • flipCode 翻转代码。可以是0,正数,负数。0表示沿X轴(水平方向的轴)翻转。1表示沿Y轴(竖直方向的轴)翻转。
    负数表示同时沿X轴和Y轴翻转。

讲原图经过着三种翻转后,与原图拼在一块,呈现出了这种奇观:

import cv2
img = cv2.imread("The_Starry_Night.jpg")
dst1 = cv2.flip(img, 0)
dst2 = cv2.flip(img, 1)
dst3 = cv2.flip(img, -1)
cv2.imshow("img", img)
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.imshow("dst3", dst3)
cv2.waitKey()
cv2.destroyAllWindows()

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】

将翻转结果放在同一张画布中

import cv2
import numpy as np
img = cv2.imread("The_Starry_Night.jpg")
dst1 = cv2.flip(img, 0)
dst2 = cv2.flip(img, 1)
dst3 = cv2.flip(img, -1)
a, b, c = img.shape
canvas = np.ones((2 * a, 2 * b, c), np.uint8) * 255
canvas[0:b, 0:a] = img
canvas[b:2*b, 0:a] = dst1
canvas[0:b, a:2*a] = dst2
canvas[b:2*b, a:2*a] = dst3
cv2.imshow("pic", canvas)
cv2.waitKey()
cv2.destroyAllWindows()

结果呈现:

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】
  1. 仿射变换 warpAffine()方法

常见的仿射变换有平移,旋转和倾斜变换。
仿射变换使用cv2.warpAffine()方法完成

warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)

  • src 原图
  • M 是一个二行三列的矩阵,也称仿射矩阵。warpAffine方法根据此矩阵的值来变换像素的位置。
    M = [[a, b, c], [d, e, f]],则像素的变换公式为:
    X = x × a + y × b + c
    Y = x × d + y × e + f
    其中x,y指原像素的x、y轴坐标。X,Y指变换后的X,Y坐标。
  • dsize 输出图像的尺寸。(不带放缩,增大的部分用黑色色素(0)填充)

这三个参数是常用的参数。其余参数建议使用默认值。
flags表示插入方式,borderMode是边界类型,borderValue表示边界值(默认0)。dst表示反射变换后输出的图像。

3.1 平移

以将《星月夜》向左平移50个像素,向下平移100个像素为例。
则M数组应写为[[1, 0, 50], [0, 1, 100]]:

import cv2
import numpy as np
img = cv2.imread("The_Starry_Night.jpg")
rows = len(img)
cols = len(img[0])
M = np.float32([[1, 0, 50],
                [0, 1, 100]])
dst = cv2.warpAffine(img, M, (cols, rows))
cv2.imshow("img", img)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】
如图所示,图像按照我们的预期成功被平移。
只是这样得到的图像有色素损失,我们丢失了超出画布之外的数据。
为了避免损失,可以取设置dsize参数来控制输出图像的大小。

修改后的代码如下:

import cv2
import numpy as np
img = cv2.imread("The_Starry_Night.jpg")
rows = len(img)
cols = len(img[0])
M = np.float32([[1, 0, 50],
                [0, 1, 100]])
dst = cv2.warpAffine(img, M, (cols+200, rows+200))
cv2.imshow("img", img)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】

3.2 旋转

旋转也是通过M矩阵来实现的,这个矩阵的运算较复杂,
OpenCV提供了getRotationMatrix2D()方法来计算旋转操作的M矩阵

getRotationMatrix2D(center, angle, scale)

  • center 指旋转中心的坐标
  • angle指旋转的角度
  • scale值缩放的比例。(旋转过程支持缩放)
import cv2
img = cv2.imread("The_Starry_Night.jpg")
rows = len(img)
cols = len(img[0])
center = (rows / 2, cols / 2)
M = cv2.getRotationMatrix2D(center, 30, 0.8)
dst = cv2.warpAffine(img, M, (cols, rows))
cv2.imshow("img", img)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

旋转效果如图所示:

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】

3.3 倾斜

OpenCV需要定位到图像的三个点的位置来计算倾斜效果,即左上角,右上角和左下角。
图像的倾斜也是根据M矩阵实现,得出矩阵的运算较复杂,通过 getAffineTransform 方法实现。

语法

getAffineTransform(src, dst)

  • src是原图像的左上角,右上角和左下角三个点的坐标。三维数组格式,形如[[a, b], [c, d], [e, f]]。
  • dst是倾斜后这三个点预期的坐标。格式同上。

要保持左上,右下,左下三个点的顺序不能乱。

以将《星月夜》保持左下角和右上角坐标不变,左上角((0,0)处)向右移动150个像素长度。
代码如下:

import cv2
import numpy as np
img = cv2.imread("The_Starry_Night.jpg")
rows = len(img)
cols = len(img[0])
p1 = np.array([[0, 0], [cols - 1, 0], [0, rows - 1]], dtype=np.float32)
p2 = np.array([[150, 0], [cols - 1, 0], [0, rows - 1]], dtype=np.float32)
M = cv2.getAffineTransform(p1, p2)
dst = cv2.warpAffine(img, M, (cols, rows))
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()

程序执行效果如下:

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】
  1. 透视

透视的实现使用的是 warpPerspective()方法,而不再是用于平移、旋转、倾斜的warpAffine()方法。
使用warpPerspective()方法也需要通过M矩阵来计算透视效果,计算透视的M矩阵可以使用 getPerspectiveTransform()方法

getPerspectiveTransform(src, dst, solveMethod=None)

该方法常用的参数有两个,分别为 原图的四个点的坐标(scr)透视后四个点的坐标(dst)。Opcv需要通过定位图像的这四个点来计算透视效果。四个点依次为左上,右上,左下,右下。
坐标格式为二维数组格式,形如[[a, b],[c, d],[e, f],[g, h]]。

示例代码如下:

import cv2
import numpy as np
img = cv2.imread("The_Starry_Night.jpg")
rows = len(img)
cols = len(img[0])

p1 = np.zeros((4, 2), np.float32)
p1[0] = [0, 0]
p1[1] = [cols - 1, 0]
p1[2] = [0, rows - 1]
p1[3] = [cols - 1, rows - 1]

p2 = np.zeros((4, 2), np.float32)
p2[0] = [150, 0]
p2[1] = [cols - 150, 0]
p2[2] = [0, rows - 1]
p2[3] = [cols - 1, rows - 1]
M = cv2.getPerspectiveTransform(p1, p2)
dst = cv2.warpPerspective(img, M, (cols, rows))
cv2.imshow('The_Starry_Night', img)
cv2.imshow('The_Starry_Night2', dst)
cv2.waitKey()
cv2.destroyAllWindows()

展示原图和透视后的图像效果:

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】

🌹꧔ꦿ本系列blog传送门:

OpenCV图像处理基本操作 【Python-Open_CV系列(一)】

OpenCV像素处理基本操作 【Python-Open_CV系列(二)】

OpenCV之 BGR、GRAY、HSV色彩空间&色彩通道专题 【Python-Open_CV系列(三)】

OpenCV绘制图像与文字(可作为脚手架代码)(python) 【Python-Open_CV系列(四)】

OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】

基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】

OpenCV基本功 之 图像的掩模、运算 & 合并专题 -小啾带学【Python-Open_CV系列(七)】

《三英战吕布》 – 图像模板匹配 【Python-Open_CV系列(八)】

OpenCV滤波器 龙门石窟篇【Python-Open_CV系列(九)】(均值滤波器、中值滤波器、高斯滤波器、双边滤波器)

Open_CV形态学运算专题 (腐蚀&膨胀、开&闭运算、梯度运算、顶帽运算黑帽运算 )【Python-Open_CV系列(十)】

霍夫变换看不懂?小啾带你串一遍:OpenCV图形检测专题 这样学最简单【Python-Open_CV系列(十一)】

小啾带你开天眼 之 开启py-OpenCV摄像头及视频处理【Python-Open_CV系列(十二)】

小啾带你开天眼 之 人脸检测与识别(以及华强、皇叔、高祖配墨镜特效)【Python-Open_CV系列(十三)】

Original: https://blog.csdn.net/weixin_48964486/article/details/123779863
Author: 侯小啾
Title: OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/671783/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Yolov3 模型结构

    0. 模型总体结构: Yolov3可以看作有三部分:Darknet53, FPN, Yolo Head. Darknet53是Yolov3的主干网络,用来提取图像特征。共提取了三个…

    人工智能 2023年6月24日
    073
  • Transformer在细粒度分类上的应用

    TransFG :Transformer在细粒度分类上的应用 摘要 1.引言 2.相关工作 * ==细粒度视觉分类== ==Transformer== 3.方法 * 3.1作为特征…

    人工智能 2023年7月3日
    0114
  • 2021“华为杯”第十八届研究生数学建模D题

    数学建模已结束数日,今晚刚好闲来无事,决定对这次数学建模进行一下总结。 题目下发以后,和队友经过一番商讨,便决定在B和D之间选择一个,原因也很简单,本身研究方向是NLP,机器学习和…

    人工智能 2023年6月16日
    088
  • opencv-python图像处理:阈值,滤波,腐蚀,膨胀,梯度

    1 图像阈值 ret, dst = cv2.threshold(src, thresh, maxval, type) src: 输入图像,只能输入单通道图像,通常来说是灰度图 ds…

    人工智能 2023年6月21日
    092
  • 联邦学习:FedProx框架

    FEDERATED OPTIMIZATION IN HETEROGENEOUS NETWORKS 每日一诗:《当年万马尽腾空,就中紫骝尤最雄》明·张居正当年万马尽腾空,就中紫骝尤最…

    人工智能 2023年7月27日
    063
  • python 中数组的基本操作

    文章目录 前言 一、numpy是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 在python中本身有着列表等数据结构,但是列表只是一种数据的存储容器,不具备任何计算能…

    人工智能 2023年7月6日
    070
  • backbone核心详解系列——RepVGG

    主要贡献 设计了重参数化的模块,将训练和推理解耦,并且设计了两个系列的整体网络结构和相应的缩放方法,可以适应不同的精度性能需求,结果显示在GPU上推理速度高于renset系列。 P…

    人工智能 2023年7月13日
    091
  • Stata:中介效应理论及sgmediation命令做sobel检验

    中介作用的检验模型可以用以下路径图来描述: 方程(1)的系数c 为自变量X对因变量Y的总效应; 方程(2)的系数a为自变量X对中介变量M的效应; 方程(3)的系数b是在控制了自变量…

    人工智能 2023年7月26日
    098
  • TensorFlow 2.0 与 1.0 的区别与联系

    一、TensorFlow 2.0 vs 1.0 对比举例: 1、TensorFlo 1.x(2015年开源) session.run() 全局化 sessions API混乱 总的…

    人工智能 2023年5月23日
    066
  • opencv dnn(C++) 实时人脸检测

    目录 环境配置 头文件-quickopencv.h 源文件-quickdemo.cpp 1.dnn::readNetFromTensorflow() 2. dnn::blobFro…

    人工智能 2023年7月18日
    069
  • 垃圾邮件分类

    sklearn实现垃圾邮件分类 准备数据 抽取特征数据 划分训练集,验证集,训练模型 评估模型 准备数据 链接:https://pan.baidu.com/s/1DcyiUgFT1…

    人工智能 2023年7月3日
    068
  • IDEA配置Maven

    文章目录 一、Maven下载&环境配置 * 1.下载Maven 2.解压 3.配置环境变量 4.测试 二、更改Maven中的设置 * 1.编辑settings.xml 2….

    人工智能 2023年7月31日
    064
  • 【python】———merge函数

    @爱学习的DUO 目录 * – 1 数据读取(A、B表) – 2 当右表无重复项 – 3 当右表有重复项 – + 3.1 数据读取(…

    人工智能 2023年7月4日
    069
  • 最近邻搜索|Nearest neighbor search

    维基百科:https://en.wikipedia.org/wiki/Nearest_neighbor_search觉得整理的挺好,翻译 最近邻搜索( NNS ) 作为邻近搜索(p…

    人工智能 2023年7月1日
    096
  • 1.小程序登录

    小程序登录 主要目的 通过微信官方提供的登录能力获取微信提供的用户身份表示,建立小程序内的用户体系。 登录流程时序 登录:小程序、开发者服务器、微信接口服务 小程序 发起 wx.l…

    人工智能 2023年6月29日
    092
  • 神经网络之损失函数

    以下是一个简单的Python代码示例,展示了如何使用卷积 神经网络(CNN)训练MNIST数据集,并绘制 _损失函数_曲线: python import tensorflow as…

    人工智能 2023年7月13日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球