我的编程空间,编程开发者的网络收藏夹
学习永远不晚

OpenCV+Python如何实现几何变换

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

OpenCV+Python如何实现几何变换

这篇文章主要介绍了OpenCV+Python如何实现几何变换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

几何变换

图像的几何变换是指将一幅图像映射到另一幅图像内。有缩放、翻转、仿射变换、透视、重映射等操作。

1 缩放

使用cv2.resize()函数实现对图像的缩放,但要注意cv2.resize()函数内的dsize参数与原图像的行列属性是相反的,也就是:目标图像的行数是原始图像的列数,目标图像的列数是原始图像的行数。

下面举例说明cv2.resize()函数的用法:

import cv2img=cv2.imread('E:/python_opencv/tupian.jpg')rows,cols=img.shape[0:2]  #行数和列数等于img的长度和宽度size=(int(cols*0.9),int(rows*0.5))  #比例:列变为原来0.9倍,行变为0.5倍rst=cv2.resize(img,size)  #将img按size比例缩放print('img.shape=',img.shape)print('rst.shape=',rst.shape)

运行程序的结果如下:

img.shape=(600,60,3)
rst.shape=(300,54,3)

可以看出,行数变为原来的0.5倍,列数变为原来的0.9倍。代码中size的行列位置发生了交换。

2 翻转

使用cv2.flip()函数对图像翻转,能够实现水平方向翻转、垂直方向翻转、两个方向同时翻转。

下面举例说明cv2.flip()函数的用法:

import cv2img=cv2.imread('E:/python_opencv/tupian.jpg')x=cv2.flip(img,0)   #图x对原图像绕x轴翻转y=cv2.flip(img,1)   #图y对原图像绕y轴翻转xy=cv2.flip(img,-1)  #图xy对原图像绕x轴y轴同时翻转cv2.imshow('img',img)cv2.imshow('x',x)cv2.imshow('y',y)cv2.imshow('xy',xy)cv2.waitKey()cv2.destroyAllWindows()

程序运行结果如下四幅图,第一幅是原图,第二幅是绕x轴翻转,第三幅是绕y轴翻转,第四幅是绕x轴y轴同时翻转。

OpenCV+Python如何实现几何变换

OpenCV+Python如何实现几何变换

OpenCV+Python如何实现几何变换

OpenCV+Python如何实现几何变换

3 仿射

仿射变换是指图像实现平移、旋转等操作。

先设置一个变换矩阵M,然后使用cv2.warpAffine()函数对原图像和变换矩阵M进行仿射操作。

(一)平移

要实现图像的平移,我们先自定义一个转换矩阵,再进行仿射平移变换。例程如下:

import cv2import numpy as npimg=cv2.imread('E:\python_opencv/tupian.jpg')height,width=img.shape[:2]     #读取原图像的长和宽x=100                      #自定义转换矩阵M的x轴移动值y=200                      #自定义转换矩阵M的y轴移动值M=np.float32([[1,0,x],[0,1,y]])    #构造转换矩阵Mmove=cv2.warpAffine(img,M,(width,height))  #平移映射cv2.imshow('orginal',img)cv2.imshow('move',move)cv2.waitKey()cv2.destroyAllWindows()

程序运行结果如下图所示,左为原图,右为平移后的图。

OpenCV+Python如何实现几何变换

OpenCV+Python如何实现几何变换

(二)旋转

使用函数cv2.getRotationMatrix2D()获得转移矩阵M,然后使用函数cv2.warpAffine()进行仿射旋转变换。例程如下:

import cv2img=cv2.imread('E:\python_opencv/tupian.jpg')height,width=img.shape[:2]  #读取原图像的长和宽M=cv2.getRotationMatrix2D((width/2,height/2),45,0.6)  #以中心为原点,逆时针旋转45°,且缩小为原图的0.6倍,获得转移矩阵Mrotate=cv2.warpAffine(img,M,(width,height))  #旋转映射cv2.imshow('original',img)cv2.imshow('rotation',rotate)cv2.waitKey()cv2.destroyAllWindows()

程序运行结果如下图所示,左为原图,右为旋转后的图。

OpenCV+Python如何实现几何变换

OpenCV+Python如何实现几何变换

4 透视

透视变换是指将矩阵图形投影到另一个视平面,可以映射为任意四边形,所以透视变换也被称为投影映射(ProjectionMapping),并不是字面意义上的“透视”。透视与上节的仿射不同,仿射可以将矩阵映射为任意平行四边形。

使用cv2.warpPerspective()函数实现透视变换。例程如下:

#完成图像透视import cv2import numpy as npimg=cv2.imread('E:/python_opencv/tupian.jpg')rows,cols=img.shape[:2]   #读取原图像的长和宽print(rows,cols)#生成旋转矩阵Mpts1=np.float32([[150,50],[400,50],[60,450],[310,450]])pts2=np.float32([[50,50],[rows-50,50],[50,cols-50],[rows-50,cols-50]])M=cv2.getPerspectiveTransform(pts1,pts2)#使用函数cv2.warpPerspective()进行透视变换dst=cv2.warpPerspective(img,M,(cols,rows))cv2.imshow('img',img)cv2.imshow('dst',dst)cv2.waitKey()cv2.destroyAllWindows()

程序运行结果如下图所示,左为原图,右为透视变换的图。

OpenCV+Python如何实现几何变换

OpenCV+Python如何实现几何变换

我们可以看到,原图片经过透视映射后,变成另一个视角下的任意四边形了。

5 重映射

重映射是修改了像素点的位置,从而生成一幅新的图像,包括:复制、绕x轴y轴翻转,x轴y轴互换,图像缩放等。

均使用cv2.remap()重映射函数进行操作。

需要注意cv2.remap()中的两个参数mapx、mapy。mapx表示对应位置上x轴坐标值,mapy表示对应位置上y轴坐标值。

(一)复制

使用cv2.remap()函数完成图像复制,需先定义mapx,mapy的值,然后循环映射每个像素点到对应的位置上。

代码如下:

import cv2import numpy as npimg=cv2.imread('E:/python_opencv/tupian.jpg')rows,cols=img.shape[:2]         #读取行列数mapx=np.zeros(img.shape[:2],np.float32) #mapx参数设定为对应位置上的x轴坐标值mapy=np.zeros(img.shape[:2],np.float32) #mapy参数设定为对应位置上的y轴坐标值for i in range(rows):          #对每个元素复制映射  for j in range(cols):    mapx.itemset((i,j),j)    mapy.itemset((i,j),i)rst=cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)cv2.imshow('original',img)cv2.imshow('result',rst)cv2.waitKey()cv2.destroyAllWindows()

执行后结果如下所示,可以看到,实现了图像的复制重映射。

OpenCV+Python如何实现几何变换

OpenCV+Python如何实现几何变换

(二)绕x轴翻转

重映射法对图像绕x轴翻转,表明mapx的值保持不变,mapy的值调整为总行数-1-当前行号,其余部分代码不变,所以循环体内代码变为:

 for i in range(rows):   for j in range(cols):     mapx.itemset((i,j),j)      #mapx的值保持不变     mapy.itemset((i,j),rows-1-i)  #mapy的值调整为总行数-1-当前行号

(三)绕y轴翻转

重映射法对图像绕y轴翻转,表明mapx的值调整为总行数-1-当前列号,mapy的值保持不变,所以循环体内代码变为:

for i in range(rows):  for j in range(cols):      mapx.itemset((i,j),cols-1-j)  #mapx的值调整为总列数-1-当前列号     mapy.itemset((i,j),i)      #mapy的值保持不变

(四)绕x轴y轴翻转

重映射也能实现图像绕x轴和y轴的同时翻转,只需将前两个部分合并,使mapx的值调整为总行数-1-当前列号,mapy的值调整为总行数-1-当前行号。例程如下:

import cv2import numpy as npimg=cv2.imread('E:\python_opencv/tupian.jpg')rows,cols=img.shape[:2]mapx=np.zeros(img.shape[:2],np.float32)mapy=np.zeros(img.shape[:2],np.float32)for i in range(rows):  for j in range(cols):    mapx.itemset((i,j),cols-1-j)  #mapx的值调整为总列数-1-当前列号    mapy.itemset((i,j),rows-1-i)  #mapy的值调整为总行数-1-当前行号rst=cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)cv2.imshow('original',img)cv2.imshow('result',rst)cv2.waitKey()cv2.destroyAllWindows()

执行后结果如下所示,可以看到,实现了图像的绕x轴和y轴翻转重映射过程。

OpenCV+Python如何实现几何变换

OpenCV+Python如何实现几何变换

(五)x轴、y轴互换

重映射中,x轴、y轴互换表明,mapx的值变为所在行的行号,mapy的值变为所在列的列号。

但当行数和列数不一致时,行或列无法完成映射的部分就被处理为0。示例代码如下:

#使用函数cv2.remap()实现图像绕x轴和y轴的互换import cv2import numpy as npimg=cv2.imread('E:\python_opencv/tupian.jpg')rows,cols=img.shape[:2]mapx=np.zeros(img.shape[:2],np.float32)mapy=np.zeros(img.shape[:2],np.float32)for i in range(rows):  for j in range(cols):    mapx.itemset((i,j),i)  #mapx的值变为所在行的行号    mapy.itemset((i,j),j)  #mapy的值变为所在列的列号rst=cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)cv2.imshow('original',img)cv2.imshow('result',rst)cv2.waitKey()cv2.destroyAllWindows()

结果如图:

OpenCV+Python如何实现几何变换

OpenCV+Python如何实现几何变换

可以看到,列数多于行数的部分被置为0(黑色)。

(六)图像的缩放

重映射提供了cv2.remap()函数能够实现图像的放大或缩小。处理图像后,可以将图像固定在围绕其中心的某个区域。

下面例程中,x轴和y轴均缩小为原来的0.25-0.75倍之间。

import cv2import numpy as npimg=cv2.imread('E:\python_opencv/tupian.jpg')rows,cols=img.shape[:2]mapx=np.zeros(img.shape[:2],np.float32)mapy=np.zeros(img.shape[:2],np.float32)for i in range(rows):  for j in range(cols):    if 0.25*cols < i < 0.75*cols and 0.25*rows < i < 0.75*rows:      #在目标图像的x轴(0.25-0.75)倍之内生成缩小图像      mapx.itemset((i,j),2*(j-0.25*cols)+0.5)      #在目标图像的y轴(0.25-0.75)倍之内生成缩小图像      mapy.itemset((i,j),2*(i-rows*0.25)+0.5)    else:      #不在上述区域的点都取(0,0)坐标点的值      mapx.itemset((i,j),0)      mapy.itemset((i,j),0)rst=cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)  #图像缩放重映射cv2.imshow('original',img)cv2.imshow('result',rst)cv2.waitKey()cv2.destroyAllWindows()

OpenCV+Python如何实现几何变换

OpenCV+Python如何实现几何变换

感谢你能够认真阅读完这篇文章,希望小编分享的“OpenCV+Python如何实现几何变换”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

OpenCV+Python如何实现几何变换

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

OpenCV+Python如何实现几何变换

这篇文章主要介绍了OpenCV+Python如何实现几何变换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。几何变换图像的几何变换是指将一幅图像映射到另一幅图像内。有缩放、翻转
2023-06-14

opencv如何实现图像几何变换

这篇文章给大家分享的是有关opencv如何实现图像几何变换的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。图像伸缩(cv2.resize)图像的扩大与缩小有专门的一个函数,cv2.resize(),那么关于伸缩需要
2023-06-14

Python OpenCV如何实现图像傅里叶变换

这篇文章给大家分享的是有关Python OpenCV如何实现图像傅里叶变换的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。二维离散傅里叶变换(DFT)对于二维图像处理,通常使用 x , y x, yx,y 表示离散
2023-06-28

opencv傅里叶变换如何实现

今天小编给大家分享一下opencv傅里叶变换如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。傅里叶变换图像处理一般分为
2023-06-30

C++ opencv图像处理怎么实现图片几何变换

本文小编为大家详细介绍“C++ opencv图像处理怎么实现图片几何变换”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++ opencv图像处理怎么实现图片几何变换”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
2023-06-30

OpenCV中常用图像几何变换有哪些

这篇文章主要为大家展示了“OpenCV中常用图像几何变换有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“OpenCV中常用图像几何变换有哪些”这篇文章吧。0 程序环境与所学函数本章程序运行需
2023-06-22

OpenCV如何通过透视变换实现矫正图像

这篇“OpenCV如何通过透视变换实现矫正图像”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“OpenCV如何通过透视变换实现
2023-07-05

python如何实现变量的交换

小编给大家分享一下python如何实现变量的交换,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!变量的交换a = 1 b = 2 如果我们需要交换a 和 b中的
2023-06-27

C++ opencv如何实现几何图形绘制

这篇“C++ opencv如何实现几何图形绘制”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++ opencv如何实现几何
2023-06-30

如何在python中实现数据变换

这篇文章将为大家详细讲解有关如何在python中实现数据变换,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录