当前位置: 首页 > news >正文

OpenCV入门(十二)快速学会OpenCV 11几何变换

OpenCV入门(十二)快速学会OpenCV 11几何变换

  • 1.图像平移
  • 2.图像旋转
  • 3.仿射变换
  • 4.图像缩放

我们在处理图像时,往往会遇到需要对图像进行几何变换的问题。图像的几何变换是图像处理和图像分析的基础内容之一,不仅提供了产生某些图像的可能,还可以使图像处理和分析的程序简单化,特别是图像具有一定的规律性时,一个图像可以由另一个图像通过几何变换来实现。所以,为了提高图像处理和分析程序设计的速度和质量,开拓图像程序应用范围的新领域,对图像进行几何变换是十分必要的。

图像的几何变换不改变图像的像素值,而是改变像素所在的几何位置。从变换的性质来分,图像的几何变换有图像的位置变换(平移、镜像、旋转)、图像的形状变换(放大、缩小、错切)等基本变换以及图像的复合变换。其中,使用最频繁的是图像的缩放和旋转,不论照片、图画、书报还是医学X光和卫星遥感图像,都会用到这两项技术。

作者:Xiou

测试原图:

在这里插入图片描述

1.图像平移

图像平移是将一幅图像中所有的点都按照指定的平移量在水平、垂直方向移动,平移后的图像与原图像相同。平移后的图像上的每一点都可以在原图像中找到对应的点。

OpenCV提供了函数warpAffine,该函数使用指定的矩阵变换源图像,声明如下:

     warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

参数:
src表示输入的图像;
M表示2×3变换矩阵;
dsize表示输出图像的大小;
dst表示大小为dsize且类型与src相同的输出图像;
flags表示插值方法的组合;
borderMode表示边界模式;
borderValue表示在边界为常量的情况下使用的值,默认为0。

代码实例:

     import numpy as npimport cv2 as cvimg = cv.imread(r'test.jpg', 1)rows, cols, channels = img.shapeM = np.float32([[1,0,100],[0,1,50]])res = cv.warpAffine(img, M, (cols, rows))cv.imshow('img', res)cv.waitKey(0)cv.destroyAllWindows()

输出结果:

在这里插入图片描述

2.图像旋转

图像的旋转是数字图像处理中一个非常重要的环节,是图像的几何变换手法之一。图像的旋转算法是图像处理的基础算法。在数字图像处理过程中。经常要用到旋转,比如在进行图像扫描时,需要运用旋转实现图像的倾斜校正;在进行多幅图像的比较和模式识别、对图像进行剪裁和拼接前,都需要进行图像的旋转处理。

一般图像的旋转是以图像的中心为原点的,将图像上的所有像素都旋转一个相同的角度。图像的旋转变换时图像的位置变换,旋转后图像的大小一般会改变。在图像旋转变换中既可以把转出显示区域的图像截去,也可以扩大图像范围以显示所有的图像。

图像旋转是指图像以某一点为中心旋转一定的角度,形成一幅新的图像的过程。当然这个点通常就是图像的中心。既然是按照中心旋转,自然会有这样一个属性:旋转前和旋转后的点离中心的位置不变。

可以利用OpenCV提供的库函数getRotationMatrix2D来实现图像旋转。该函数用来计算出旋转矩阵,声明如下:

     getRotationMatrix2D(center, angle, scale) 

参数
center表示旋转的中心点;
angle表示旋转的角度;
scale表示图像缩放因子。
该函数的返回值为一个2×3的矩阵,其中矩阵前两列代表旋转、最后一列代表平移。

代码实例:

import cv2
import numpy as npimg=cv2.imread('test.jpg')rows,cols=img.shape[:2]M=cv2.getRotationMatrix2D((cols/2,rows/2),60,1.2)
#第一个参数是旋转中心,第二个参数是旋转角度,第三个因子是旋转后的缩放因子shuchu=cv2.warpAffine(img,M,(2*cols,rows)) # 第三个参数是输出图像的尺寸中心,图像的宽和高
while(1):cv2.imshow('Result',shuchu)if cv2.waitKey(1)&0xFF==27:break
cv2.destroyAllWindows()

输出结果:

在这里插入图片描述

不出现裁剪的旋转

代码实例:

import cv2
import numpy as np
img=cv2.imread('test.jpg')def rotate_bound(image, angle):# 抓取图像的尺寸,然后确定中心(h, w) = image.shape[:2](cX, cY) = (w // 2, h // 2)# 抓取旋转矩阵(应用角度的负数顺时针旋转),然后抓取正弦和余弦# (即矩阵的旋转分量)M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)cos = np.abs(M[0, 0])sin = np.abs(M[0, 1])# 计算图像的新边界尺寸nW = int((h * sin) + (w * cos))nH = int((h * cos) + (w * sin))# 调整旋转矩阵以考虑平移M[0, 2] += (nW / 2) - cXM[1, 2] += (nH / 2) - cY# 执行实际旋转并返回图像shuchu=cv2.warpAffine(image, M, (nW, nH))while (1):cv2.imshow('shuchu', shuchu)if cv2.waitKey(1) & 0xFF == 27:breakrotate_bound(img,45)

在上述代码中,首先抓取图像的尺寸,然后确定中心,接着抓取旋转矩阵、正弦和余弦,再计算图像的新边界尺寸,调整旋转矩阵以考虑平移,最后执行实际旋转并返回图像。

输出结果:
在这里插入图片描述

3.仿射变换

仿射变换是一种常用的图像几何变换。平移、旋转、缩放、翻转、剪切等变换都属于仿射变换。使用仿射变换矩阵能够方便地描述图像的线性变换以及平移等非线性变换。仿射变换的功能是从二维坐标到二维坐标之间的线性变换,且保持二维图形的“平直性”和“平行性”。

在OpenCV中,进行仿射变换的函数是warpAffine,声明如下:

     warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) 

其中,
src表示输入图像;
dst表示输出图像,尺寸由dsize指定,图像类型与原图像一致;
M表示2×3的变换矩阵;
dsize指定图像输出尺寸;
flags表示插值算法标识符,如果为WARP_INVERSE_MAP,则有默认值INTER_LINEAR;
borderMode表示边界像素模式,有默认值BORDER_CONSTANT;
borderValue表示边界取值,有默认值Scalar(),即0。

代码实例:

import numpy as np
import cv2 as cvimg = cv.imread(r'test.jpg', 1)
rows, cols, channels = img.shape
p1 = np.float32([[0,0], [cols-1,0], [0,rows-1]])
p2 = np.float32([[0,rows*0.3], [cols*0.8,rows*0.2], [cols*0.15,rows*0.7]])
M = cv.getAffineTransform(p1, p2)
dst = cv.warpAffine(img, M, (cols,rows))
cv.imshow('original', img)
cv.imshow('result', dst)
cv.waitKey(0)
cv.destroyAllWindows()

在上述代码中,getRotationMatrix2D先计算出旋转矩阵,再利用函数warpAffine实现旋转。仿射变换中的平移、旋转、缩放、翻转(翻转镜像除了用三点法求仿射变换矩阵外,还可以用flip函数实现)和错切主要是一个仿射映射矩阵的设置,灵活地设置不同的变换矩阵可以得到不同的变换效果。这里的仿射变换要想得到很好的效果,如旋转以后图像的大小不变而且图像位于窗口中心,就需要进行窗口大小调整和旋转后图像的平移操作。

输出结果:
在这里插入图片描述

4.图像缩放

图像比例缩放是指将给定的图像在x轴方向按比例缩放fx倍,在y轴方向按比例缩放fy倍,从而获得一幅新的图像。如果fx=fy,即在x轴方向和y轴方向缩放的比率相同,就称这样的比例缩放为图像的全比例缩放。如果fx≠fy,图像的比例缩放会改变原始图像的像素间的相对位置,产生几何畸变。

OpenCV中,实现图像缩放的函数是resize,函数声明如下:

     resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

参数
src表示原图像;
dst表示输出图像;
dsize表示目标图像的大小;
fx表示在x轴上的缩放比例;
fy表示在y轴上的缩放比例;
interpolation表示插值方式,包括INTER_NN(最近邻插值)、INTER_LINEAR(默认值,双线性插值)、INTER_AREA(使用像素关系重采样,当图像缩小时该方法可以避免波纹出现,当图像放大时类似于INTER_NN方法)、INTER_CUBIC(立方插值)。

注意:dsize、fx和fy不能同时为零。

代码实例:

import numpy as np
import cv2def resizeImage(image,width=None,height=None,inter=cv2.INTER_AREA):newsize = (width,height)#获取图像尺寸(h,w) = image.shape[:2]if width is None and height is None:return image#高度算缩放比例if width is None:n = height/float(h)newsize = (int(n*w),height)else :n = width/float(w)newsize = (width,int(h*n))# 缩放图像newimage = cv2.resize(image, newsize, interpolation=inter)return newimageimageOriginal = cv2.imread("lakeWater.jpg")
cv2.imshow("Original", imageOriginal)
#获取图像尺寸
w = width=imageOriginal.shape[1]
h = width=imageOriginal.shape[2]
print ("Image size:",w,h)
#放大2倍
newimage = resizeImage(imageOriginal,w*2,h*2,cv2.INTER_LINEAR)
cv2.imshow("New", newimage)
#保存缩放后的图像
cv2.imwrite('newimage.jpg',newimage)
#缩小5倍
newimage2 = resizeImage(imageOriginal,int(w/5),int(h/5),cv2.INTER_LINEAR)
cv2.imwrite('newimage2.jpg',newimage2)
cv2.imshow('result', newimage)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,我们先显示了原图,然后先后利用resize函数对图像进行放大2倍和缩小5倍处理。

输出结果:

在这里插入图片描述

相关文章:

OpenCV入门(十二)快速学会OpenCV 11几何变换

OpenCV入门(十二)快速学会OpenCV 11几何变换1.图像平移2.图像旋转3.仿射变换4.图像缩放我们在处理图像时,往往会遇到需要对图像进行几何变换的问题。图像的几何变换是图像处理和图像分析的基础内容之一,不仅提供了产生某些图像的可…...

小菜鸟Python历险记:(第二集)

今天写的文章是记录我从零开始学习Python的全过程。Python基础语法学习:Python中的数值运算一共有7种,分别是加法()、减法(-)、除法(/)得到的结果是一个浮点数、乘法(*&a…...

ContentProvider程序之间数据的相互调用

1权限的获取和调用 权限分为普通权限和危险权限,除了日历信息,电话,通话记录,相机,通讯录,定位,麦克风,电话,传感器,界面识别(Activity-Recognit…...

金三银四最近一次面试,被阿里P8测开虐惨了...

都说金三银四涨薪季,我是着急忙慌的准备简历——5年软件测试经验,可独立测试大型产品项目,熟悉项目测试流程...薪资要求?5年测试经验起码能要个20K吧 我加班肝了一页半简历,投出去一周,面试电话倒是不少&a…...

算法题——给定一个字符串 s ,请你找出其中不含有重复字符的最长子串 的长度

给定一个字符串 s ,请你找出其中不含有重复字符的最长子串 的长度 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”&am…...

机器学习中的数学原理——F值与交叉验证

通过这篇博客,你将清晰的明白什么是F值、交叉验证。这个专栏名为白话机器学习中数学学习笔记,主要是用来分享一下我在 机器学习中的学习笔记及一些感悟,也希望对你的学习有帮助哦!感兴趣的小伙伴欢迎私信或者评论区留言&#xff0…...

vue.js介绍

个人名片: 😊作者简介:一名大一在校生,web前端开发专业 🤡 个人主页:python学不会123 🐼座右铭:懒惰受到的惩罚不仅仅是自己的失败,还有别人的成功。 🎅**学习…...

【设计模式】1、设计模式七大原则

目录一、单一职责二、接口隔离三、依赖倒置(倒转)四、里氏替换五、迪米特法则(Law of Demeter)六、开闭七、合成复用一、单一职责 类(或方法)功能的专一性。一个类(或方法)不应该承担…...

【前端老赵的CSS简明教程】10-1 CSS预处理器和使用方法

大家好,欢迎来到本期前端课程。我是前端老赵,今天的课程将讲解CSS预处理器的概念和使用方法,希望能够帮助大家更好地进行前端开发。 CSS预处理器是什么? CSS预处理器是一种将类似CSS的语言转换为CSS的工具。它们提供了许多额外的功能,如变量、嵌套、混入、函数等等。这些…...

BFC详解

1. 引言 在前端的布局手段中,一直有这么一个知识点,很多前端开发者都知道有它的存在,但是很多人也仅仅是知道它的存在而已,对它的作用也只是将将说得出来,可是却没办法说得非常的清晰。这个知识点,就是BFC…...

C++:哈希结构(内含unordered_set和unordered_map实现)

unordered系列关联式容器 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到$log_2 N$,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好 的查询是&#xff…...

Java实现调用第三方相关接口(附详细思路)

目录1.0.简单版2.0.升级版2-1.call.timeout()怎么传入新的超时值2-2.timeout(10, TimeUnit.SECONDS)两个参数的意思,具体含义3.0.进阶版3-1.java.net.SocketTimeoutException: 超时如何解决4.0.终极版1.0.简单版 以下是一个使用 Java 实际请求“第三方”的简单示例代…...

基础数据结构:单链表

今天懒洋洋学习了关于基础数据结构有关单链表的相关操作,懒洋洋来这温习一下。一:单链表的定义链表定义:用链式存储的线性表统称为链表,即逻辑结构上连续,物理结构上不连续。链表分类:单链表、双链表、循环链表、静态链…...

基于51单片机的智能计算器Protues仿真设计

目录 一、设计背景 二、实现功能 三、硬件设计 3.1 总体硬件设计 ​3.2 键盘电路的设计 3.3 显示电路的设计 四、仿真演示 五、源程序 一、设计背景 随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展&am…...

Pandas数据分析实战练习

Pandas数据分析实战练习 文章目录 Pandas数据分析实战练习一、读取Excel文件中的数据1、读取工号、姓名、时段、交易额这四列数据,使用默认索引,输出前10行数据2、读取第一个worksheet中所有列,跳过第1、3、5行,指定下标为1的列中数据为DataFrame的行索引标签二、筛选符合特…...

C++ 继承下(二篇文章学习继承所有知识点)

5.继承与友元友元关系不能继承&#xff0c;也就是说基类友元不能访问子类私有和保护成员 //验证友元不能继承 class B {friend void Print(); public:B(int b): _b(b){cout << "B()" << endl;}protected:int _b; };class D : public B { public:D(int b,…...

【C++】C++11新特性——类的改进|lambda表达式

文章目录一、类的改进1.1 默认生成1.2 移动构造函数1.3 移动赋值重载函数1.4 成员变量缺省值1.5 强制生成默认函数的关键字default1.6 禁止生成默认函数的关键字delete1.6.1 C98防拷贝1.6.1 C11防拷贝二、lambda表达式2.1 对比2.2 lambda表达式语法2.3 捕捉列表2.4 函数对象与l…...

C语言进阶(37) | 程序环境和预处理

目录 1.程序的翻译环境和执行环境 2.详解编译链接 2.1 翻译环境 2.2 编译本身也分为几个阶段: 2.3 运行环境 3.预处理详解 3.1预定符号 3.2 #define 3.3 #undef 3.4 命令行定义 3.5 条件编译 3.6 文件包含 了解重点&#xff1a; 程序的翻译环境程序的执行环境详解: C语言程…...

Golang每日一练(leetDay0005)

目录 13. 罗马数字转整数 Roman to Integer ★ 14. 最长公共前缀 Longest Common Prefix ★ 15. 三数之和 3Sum ★★★ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 13. 罗马数字转…...

occt_modeling_data(一)——拓扑

下面是我基于opencascade英文文档中关于occt_modeling_data中Topology部分进行的翻译&#xff0c;英文好的还是建议直接看文档&#xff0c;部分我不肯定的地方我会附上英文原句。如发现有错误欢迎评论区留言。 OCCT Topolog允许用户访问和操纵物体的数据&#xff0c;且不需要处…...

【AcWing】蓝桥杯备赛-深度优先搜索-dfs(3)

目录 写在前面&#xff1a; 题目&#xff1a;93. 递归实现组合型枚举 - AcWing题库 读题&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 数据范围&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 解题思路&#xff1a; 代码&#xff1a; AC &…...

宇宙最强-GPT-4 横空出世:最先进、更安全、更有用

文章目录前言一、准确性提升1.创造力2.视觉输入3.更长的上下文二、相比于ChatGPT有哪些提升1.GPT-4 的高级推理能力超越了 ChatGPT2.GPT-4 在多种测试考试中均优于 ChatGPT。三、研究团队在GPT-4模型都做了哪些改善1.遵循 GPT、GPT-2 和 GPT-3 的研究路径2.我们花了 6 个月的时…...

HashMap的实际开发使用

目 录 前言 一、HashMap是什么&#xff1f; 二、使用步骤 1.解析一下它实现的原理 ​编辑 2.实际开发使用 总结 前言 本章&#xff0c;只是大概记录一下hashMap的简单使用方法&#xff0c;以及理清一下hashMap的put方法的原理&#xff0c;以及get方法的原理。 一、Has…...

OpenCV入门(十三)快速学会OpenCV 12 图像梯度

OpenCV入门&#xff08;十三&#xff09;快速学会OpenCV 12 图像梯度1.Sobel算子1.1 计算x1.2 计算y1.3 计算xy2.Scharr算子2.1 计算x2.2 计算y2.3 计算xy3.Laplacian算子4.总结图像梯度计算的是图像变化的速度。对于图像的边缘部分&#xff0c;其灰度值变化较大&#xff0c;梯…...

软考:常见小题目计算题

01采购合同的类型采购合同主要包括总价类合同、成本补偿类合同、工料合同三大类合同。1、总价类合同此类合同为既定产品、服务或成果的采购设定一个总价。这种合同应在已明确定义需求&#xff0c;且不会出现重大范围变更的情况下使用。包括&#xff1a;&#xff08;1&#xff0…...

【Linux】进程的程序替换

文章目录1. 程序替换1.创建子进程的目的是什么&#xff1f;2.了解程序是如何进行替换的3. 程序替换的基本原理当创建进程的时候&#xff0c;先有进程数据结构&#xff0c;还是先加载代码和数据&#xff1f;程序替换是整体替换&#xff0c;不是局部替换execl 返回值4. 替换函数1…...

【C++】模板(上)

文章目录1、泛型编程2、函数模板函数模板的实例化模板参数的匹配原则3、 类模板类模板的实例化1、泛型编程 void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left …...

express框架利用formidable上传图片

express框架&#xff0c;在上传图片功能方面&#xff0c;用formidable里面的incomingform功能&#xff0c;很方便。很多功能都已经封装好了&#xff0c;非常好用&#xff0c;简单&#xff0c;不需要写更深层次的代码了。确实不错。 下面是我自己跟着黑马教程的博客系统的部分&…...

测试背锅侠?入职软件测试后大d佬给我丢了这个bug分类分析,至今受益匪浅......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 刚成为入职&#xf…...

STM32 OTA应用开发——通过内置DFU实现USB升级(方式1)

STM32 OTA应用开发——通过内置DFU实现USB升级&#xff08;方式1&#xff09; 目录STM32 OTA应用开发——通过内置DFU实现USB升级&#xff08;方式1&#xff09;前言1 硬件介绍2 环境搭建2.1 Keil uVsion2.2 zadig2.3 STM32CubeProgrammer2.4 安装USB驱动3 OTA升级结束语前言 …...

用手机怎么制作app软件/seo网络推广怎么做

一、元素背景是指哪些区域 默认情况下元素的背景是指元素border&#xff08;包含border&#xff09;以内的区域。 在CSS3中可用使用background-clip改变元素背景区域。 1.1 background-clip 指定背景在被应用元素上的绘制区域。元素盒模型包含content, padding, border, margi…...

做网站和做网页有什么区别/宁波seo托管公司

使用 get() 来处理返回的对象以得到基础的数组...

凡客网站网址/国际大新闻最新消息

php获取url中的参数信息&#xff0c;是PHP面试过程中常见的考点之一&#xff0c;也是我们日常项目开发过程中&#xff0c;经常需要实现的一个功能&#xff0c;我们可以通过PHP中parse_url等相关函数来实现。那么对于PHP新手来说&#xff0c;具体怎么实现可能有一定的难度&#…...

永久免费手机网站建设/seo的最终是为了达到

解决方法:考虑在后面加一句&#xff1a;plt.show() 原理&#xff1a;plt.imshow()函数负责对图像进行处理&#xff0c;并显示其格式&#xff0c;而plt.show()则是将plt.imshow()处理后的函数显示出来。 转载于:https://www.cnblogs.com/w33-blog/p/9956252.html...

wordpress使用php动态生成下载页/seo职业培训班

函数、符号及特殊字符 声调 语法效果语法效果语法效果\bar{x}\acute{\eta}\check{\alpha}\grave{\eta}\breve{a}\ddot{y}\dot{x}\hat{\alpha}\tilde{\iota} 函数 语法效果语法效果语法效果\sin\theta\cos\theta\tan\theta\arcsin\frac{L}{r}\arccos\frac{T}{r}\arctan\frac{L}{…...

宜春网站建设哪家专业/义乌最好的电商培训学校

原文地址&#xff1a;http://www.tuicool.com/articles/MzeM7r 本博文少许理论资料来至DBA技术大牛 http://blog.csdn.net/tianlesoftware/article/details/4717318 &#xff0c;本着实践式学习&#xff0c;书写以下博文&#xff1a; 一、什么是分区表 Oracle提供了分区技…...