几何变换不改变图像的像素值,只是实现图像像素点的重新安排;恰当的进行图像的几何变换,可以减小甚至避免由于角度等一些因素造成的图像失真问题,有利于我们在识别图像时将注意力集中到图像的有效信息中而不至于被位置、角度等因素影响

目录

1. 平移变换

平移原理

读取原图信息

构造移动矩阵

平移图像

2. 缩放变换

图像的放大

图像的缩小

3. 旋转变换

4. 镜像变换

复制原图

水平镜像

垂直镜像

对角镜像

5. 仿射变换

结束语


1. 平移变换

此处参考:知乎文章

平移原理

图像的平移就是将图像沿着某一个方向或者多个方向进行移动,通常会是向二维中的 x 轴或者 y 轴的方向进行移动

OpenCV 提供函数 warpAffine(img, mat, size)

各个参数含义:img -- 移动的图像

mat -- 平移矩阵,决定平移的方向和距离

size -- 决定平移后显示图像的大小,不改变窗口大小

在进行移动时首先需要构造一个移位矩阵 mat,通过该矩阵可以确定图像的移动方向和移动距离;构造的矩阵是一个两行三列的矩阵:

通过 x&y 来决定移动的方向以及距离

读取原图信息

"""
Author:XiaoMa
date:2021/10/19
"""
import cv2
import numpy as np
import matplotlib.pyplot as pltimg1 = cv2.imread('E:\From Zhihu\For the desk\de.jpg')   #读取原图
img1_1 = cv2.resize(img1, dsize = None, fx = 0.6, fy = 0.6)   #调整原图大小
cv2.namedWindow("W0")
print(img1_1.shape)                                           #读取图像信息
cv2.imshow("W0", img1)
cv2.waitKey(delay = 0)

获得图像:

获得图像信息:(487, 720, 3)

该图像为一幅分辨率为 487*720 的三通道图像,当然这是经过缩放后的分辨率,原分辨率应该为 (487/0.6)*(720/0.6) 的三通道图像

可以试一下:

print(img1.shape)                                           #读取原图信息

获得的信息为:(811, 1200, 3)

构造移动矩阵

在此处需要使用到 numpy 库

mat = np.float32([[1, 0, 0], [0, 1, 20]])     #构造平移矩阵,对 y 轴进行移动

上面的代码是使原图 x 轴不发生移动,y 轴移动20个单位

平移图像

"""
Author:XiaoMa
date:2021/10/19
"""
import cv2
import numpy as np
import matplotlib.pyplot as pltimg1 = cv2.imread('E:\From Zhihu\For the desk\de.jpg')   #读取原图
img1_1 = cv2.resize(img1, dsize = None, fx = 0.6, fy = 0.6)   #调整原图大小
cv2.namedWindow("W0")
print(img1_1.shape)                                           #读取图像信息
cv2.imshow("W0", img1_1)
cv2.waitKey(delay = 0)mat = np.float32([[1, 0, 0], [0, 1, 50]])     #构造平移矩阵,对 y 轴进行移动
img1_1_1 = cv2.warpAffine(img1_1, mat, (487, 720))
cv2.namedWindow("W1")
cv2.imshow("W1", img1_1_1)
cv2.waitKey(delay = 0)

得到的图像如下:

首先是图像的移动距离很小(20 本来就很小),而且移动是向下的,这个和前面的文章中讲到的 OpenCV 绘图是一样的,其次通过平移得到的图像尺寸是按照设定来的,而使用 img.shape 得到的图像信息 x 和 y 是反过来的,下面我们对移动矩阵和移动大小进行修改:

mat = np.float32([[1, 0, 0], [0, 1, 50]])     #构造平移矩阵,对 y 轴进行移动
img1_1_1 = cv2.warpAffine(img1_1, mat, (720, 487))
cv2.namedWindow("W1")
cv2.imshow("W1", img1_1_1)
cv2.waitKey(delay = 0)

         其实移动 50 也有点小,但足够观察出变化

2. 缩放变换

图像的缩放就是对原图的尺寸大小进行调整,这个我们在前面文章中已经使用过了,使用 resize() 函数就可以达到目的,在这里我们再次进行学习加强记忆

图像的放大

"""
Author:XiaoMa
date:2021/10/19
"""
import cv2
import numpy as np
import matplotlib.pyplot as pltimg1 = cv2.imread('E:\From Zhihu\For the desk\de.jpg')   #读取原图
img1_1 = cv2.resize(img1, dsize = None, fx = 0.6, fy = 0.6)   #调整原图大小
cv2.namedWindow("W0")
print(img1_1.shape)
cv2.imshow("W0", img1)
cv2.waitKey(delay = 0)mat = np.float32([[1, 0, 0], [0, 1, 50]])     #构造平移矩阵,对 y 轴进行移动
img1_1_1 = cv2.warpAffine(img1_1, mat, (720, 487))
cv2.namedWindow("W1")
cv2.imshow("W1", img1_1_1)
cv2.waitKey(delay = 0)img1_11 = cv2.resize(img1_1, dsize = None, fx = 2, fy = 2)
cv2.namedWindow("W2")
cv2.imshow("W2", img1_11)
cv2.waitKey(delay = 0)

在读取原图时已经将原图进行了 0.6 的缩小,后面又经过了 2 倍的放大,所以最后的得到的图像应该是原图的 1.2 倍

图像的缩小

图像的缩小其实和图像的放大一样,只是将参数修改为小于 1 的数即可:

img1_11 = cv2.resize(img1_1, dsize = None, fx = 0.3, fy = 0.3)

         0.6*0.3 = 0.18;即最上面的那幅小图尺寸是最下面的大图的 0.18 倍

3. 旋转变换

此处参考:图像的几何变换

cv2.getRotationMatrix2D()

对于图像的变换,OpenCV 提供了 getRotationMatrix2D() 函数,该函数包含三个参数,第一个参数是旋转中心,第二个参数是旋转角度,第三个参数是缩放比例

具体操作代码如下:

import cv2img1 = cv2.imread('E:\From Zhihu\For the desk\de.jpg')   #读取原图
img1_1 = cv2.resize(img1, dsize = None, fx = 0.6, fy = 0.6)   #调整原图大小
cv2.namedWindow("W0")
print(img1_1.shape)
cv2.imshow("W0", img1)
cv2.waitKey(delay = 0)img1_11 = cv2.resize(img1_1, dsize = None, fx = 0.3, fy = 0.3)
cv2.namedWindow("W2")
cv2.imshow("W2", img1_11)
cv2.waitKey(delay = 0)print(img1_11.shape)
M = cv2.getRotationMatrix2D((108, 73), 45, 1)   #第一个参数为旋转中心,和上一句得到的图像信息有关
cv2.namedWindow("W3")
res = cv2.warpAffine(img1_11, M, (216, 146))cv2.imshow("W3", res)
cv2.waitKey(delay = 0)

可以从上面的代码中看出,图像的旋转最终还是与平移函数有关的

得到的图像如下:

                                    

但是我们可以看出旋转后的图像显示的不完全,如果希望通过旋转得到完整的图像,可以参考下面的这篇文章:旋转得到完整图像

4. 镜像变换

所谓镜像变换就是将图像以某一条边或者某一条线进行对称画图,其中的具体实现方法是构造一个和原图一模一样的图像,包括通道数,然后按照需要实现的变换将其中的像素点进行更换即可

复制原图

我们要使用 copy.deepcopy(img) 函数进行原图的复制

img1_2 = copy.deepcopy(img1_1)
cv2.namedWindow("W3")
cv2.imshow("W3", img1_2)
cv2.waitKey(delay = 0)

可以看出,得到的复制出的图像和原图是一摸一样的

水平镜像

水平镜像就是将图像按照左右对称的方式进行复制,所以我们不需要改变矩阵高度方向上的像素值,只是改变水平方向上的像素点即可:

img1_2 = copy.deepcopy(img1_1)
h = size[0]
w = size[1]for i in range(h):for j in range(w):img1_2[i, w - 1- j] = img1_1[i, j]  #像素点进行更换
cv2.namedWindow("W3")
cv2.imshow("W3", img1_2)
cv2.waitKey(delay = 0)

        上面显示的就是经过水平变换得到的图像

垂直镜像

还是和上面的水平镜像一样,垂直变换则是只更换高度方向的像素点即可

img1_2 = copy.deepcopy(img1_1)
h = size[0]
w = size[1]for i in range(h):for j in range(w):img1_2[h -1 -i, j] = img1_1[i, j] #将高度方向的像素点进行更换
cv2.namedWindow("W3")
cv2.imshow("W3", img1_2)
cv2.waitKey(delay = 0)

对角镜像

水平镜像和垂直镜像同时发生

img1_2 = copy.deepcopy(img1_1)
h = size[0]
w = size[1]for i in range(h):for j in range(w):img1_2[h -1 -i, w - 1 - j] = img1_1[i, j]
cv2.namedWindow("W3")
cv2.imshow("W3", img1_2)
cv2.waitKey(delay = 0)

5. 仿射变换

仿射变换即为二维空间中的变换,前面提到的四种变换都可以包含在仿射变换中,如果需要加强了解可以参考下面的这篇文章,本文中就不赘述了

仿射变换(Affine Transformation)原理及应用(1)

结束语

这篇文章中总结了图像几何变换中的平移变换、旋转变换、缩放变换、镜像变换、仿射变换这五个部分,后面还有透视变换单独花一些时间来介绍,因为那部分比较难,其中参考的一些文章已经添加了链接,如果想进行更加全面的学习可以点进去进行查看,加油!

Python 计算机视觉(五)—— OpenCV 进行图像几何变换相关推荐

  1. 《OpenCv视觉之眼》Python图像处理五 :Opencv图像去噪处理之均值滤波、方框滤波、中值滤波和高斯滤波

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  2. python matplotlib 显示opencv的图像

    python matplotlib 显示opencv的图像 首先需要import import cv2 import numpy as np from matplotlib import pyplot ...

  3. python计算机视觉-- 基于OpenCV的图像分割和图像融合系统

    目录 前言 一.需求分析 二.概要设计 2.1 基本原理 2.2 界面设计 三.详细设计 3.1 系统流程图 3.2 数据集 3.3 代码实现 3.3.1 利用deeplabV3模型分割 3.3.2  ...

  4. OpenCV入门(C++/Python)-使用OpenCV裁剪图像(四)

    裁剪是为了从图像中删除所有不需要的物体或区域.甚至突出显示图像的特定功能. 使用OpenCV裁剪没有特定的功能,NumPy数组切片是工作.读取的每个图像都存储在2D数组中(对于每个颜色通道).只需指定 ...

  5. python计算机视觉编程——基本的图像操作和处理

    python计算机视觉编程--第一章(基本的图像操作和处理) 第1章 基本的图像操作和处理 1.1 PIL:Python图像处理类库 1.1.1 转换图像格式--save()函数 1.1.2 创建缩略 ...

  6. OpenCV入门(C++/Python)- 使用OpenCV标注图像(六)

    使用OpenCV标注图像 用颜色线标注图像 绘制圆 绘制实心圆 绘制矩阵 绘制椭圆 绘制带轮廓和填充半椭圆 使用文本注释图像 为图像和视频添加标注的目的不止一个,包含: 向视频中添加信息 在对象检测的 ...

  7. 【OpenCV】图像几何变换:旋转,缩放,斜切

    2019独角兽企业重金招聘Python工程师标准>>> 几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动. 几何运算需要空间变换和灰度级差值两个步骤的算 ...

  8. 如何在 Python 中使用 OpenCV 在图像上添加水印

    简介 水印是企业和在线内容信用标记的重要组成部分.它可以以标志.签名或印章的形式出现,对创作者来说是独一无二的.在向数字世界中的对象创建者提供所有权或信用时,它是一个非常重要的工具. 大多数专业人士使 ...

  9. 在Python中使用OpenCV裁剪图像

    What is Cropping? 什么是播种? Cropping is the removal of unwanted outer areas from a photographic or illu ...

最新文章

  1. [微信官方文档] 小程序-错误码信息与解决方案表
  2. java ipv6正则表达式_IPV4和IPV6正则表达式的深入讲解
  3. 7月清北学堂培训 Day 5
  4. I.MX6 Linux Serial Baud Rate hacking
  5. HoloLens1开发(三):Trilib插件动态加载模型-Part2
  6. PHP 模拟库存出库商品
  7. lopatkin俄大神精简中文系统Windows 10 Enterprise 18362.145 19H1 Release x86-x64 ZH-CN BOX
  8. iOS - Push 通知推送
  9. 软件文档写作学习总结——绪论
  10. .NET 开发从入门到精通
  11. 网页进行针式打印_针式打印机的页面打印设置小技巧解析
  12. BottledWater-PG:PostgreSQL集成Kafka的实时数据交换平台
  13. python实现嗅探
  14. 阿里云ECS服务器修复漏洞
  15. 人生百味-10:顺势而为(外圆)与自我坚持(内方)
  16. 【《操作系统慕课版》合集】期末复习 + 核心算法整理 + 课后答案
  17. 云原生---docker
  18. Android 仿微信裁剪图片
  19. maven配置项目根路径_Maven 基本概念——根目录、项目创建、坐标
  20. 这届程序YUAN可太优秀了

热门文章

  1. web service方法进行全文检索_SpringMVC(Web应用)配置教程终章项目实战
  2. ftp软件哪个好用_和平精英录屏软件哪个好用 和平精英录屏软件介绍
  3. 【MM】新建移动类型(Movement Type)
  4. 【PM模块】维护业务处理流程—内部维护(通知单)
  5. Smart Form不弹出假脱机设置界面直接打印预览
  6. 公司间采购的后台配置备忘录
  7. SAP FI/CO模块调研问卷
  8. ALV报表中处理双击行项目事件
  9. 架构师接龙:百姓网潘晓良VS. 盛大许式伟
  10. 从拼速度到拼质量,农产品上行迎来新拐点