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

如何分析Python图像处理中的几何变换

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

如何分析Python图像处理中的几何变换

今天就跟大家聊聊有关如何分析Python图像处理中的几何变换,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

一.图像几何变换

图像几何变换不改变图像的像素值,在图像平面上进行像素变换。适当的几何变换可以最大程度地消除由于成像角度、透视关系乃至镜头自身原因所造成的几何失真所产生的负面影响。几何变换常常作为图像处理应用的预处理步骤,是图像归一化的核心工作之一[1]。

一个几何变换需要两部分运算:

空间变换:包括平移、缩放、旋转和正平行投影等,需要用它来表示输出图像与输入图像之间的像素映射关系。

灰度插值算法:按照这种变换关系进行计算,输出图像的像素可能被映射到输入图像的非整数坐标上[2]。

图像几何变换在变换过程中会建立一种原图像像素与变换后图像像素之间的映射关系,通过这种关系,能够从一方的像素计算出另一方的像素的坐标位置。通常将图像坐标映射到输出的过程称作向前映射,反之,将输出图像映射到输入的过程称作向后映射。向后映射在实践中使用较多,原因是能够避免使用向前映射中出现映射不完全和映射重叠的问题。

图6-1展示了图像放大的示例,右边图中只有(0,0)、(0,2)、(2,0)、(2,2)四个坐标根据映射关系在原图像中找到了相对应的像素,其余的12个坐标没有有效值[3]。

如何分析Python图像处理中的几何变换

对于数字图像而言,像素的坐标是离散型非负整数,但是在进行变换的过程中有可能产生浮点坐标值。这在图像处理中是一个无效的坐标。为了解决这个问题需要用到插值算法。常见算法如下:

  • 最近邻插值

  • 双线性插值

  • 双立方插值

图像变换是建立在矩阵运算基础上,通过矩阵运算可以很快找到对应关系。在这篇文章中,我们将介绍常见的图像几何变换,包括图形平移、图像缩放、图像旋转、图像镜像、图像仿射、图像透视等。

二.图像平移

图像平移是将图像中的所有像素点按照给定的平移量进行水平或垂直方向上的移动。假设原始像素的位置坐标为(x0,y0),经过平移量(△x,△y)后,坐标变为(x1, y1),如图6-2所示[3-5]。

如何分析Python图像处理中的几何变换

用数学式子表示为公式(6-1)。

如何分析Python图像处理中的几何变换

用矩阵表示如公式(6-2)所示:

如何分析Python图像处理中的几何变换

式子中,矩阵称为平移变换矩阵或因子,△x和△y称为平移量。图像平移首先定义平移矩阵M,再调用warpAffine()函数实现平移,核心函数如下:

M = np.float32([[1, 0, x], [0, 1, y]])

– M表示平移矩阵,其中x表示水平平移量,y表示垂直平移量

shifted = cv2.warpAffine(class="lazy" data-src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

– class="lazy" data-src表示原始图像

– M表示平移矩阵

– dsize表示变换后的输出图像的尺寸大小

– dst为输出图像,其大小为dsize,类型与class="lazy" data-src相同

– flag表示插值方法的组合和可选值

– borderValue表示像素外推法,当borderMode = BORDER_TRANSPARENT时,表示目标图像中的像素不会修改源图像中的“异常值”。

– borderValue用于边界不变的情况,默认情况下为0

下面代码是图像平移的一个简单案例,它定义了图像平移矩阵M,然后调用warpAffine()函数将原始图像垂直向下平移了50个像素,水平向右平移了100个像素。

# -*- coding:utf-8 -*-# By:Eastmountimport cv2import numpy as np#读取图片class="lazy" data-src = cv2.imread('scenery.png')#图像平移矩阵M = np.float32([[1, 0, 100], [0, 1, 50]])#获取原始图像列数和行数rows, cols = class="lazy" data-src.shape[:2]#图像平移result = cv2.warpAffine(class="lazy" data-src, M, (cols, rows)) #显示图像cv2.imshow("original", class="lazy" data-src)cv2.imshow("result", result)#等待显示cv2.waitKey(0)cv2.destroyAllWindows()

输出结果如图6-3所示:

如何分析Python图像处理中的几何变换

下面一个案例是将图像分别向下、向上、向右、向左平移,再调用matplotlib绘图库依次绘制的过程。

# -*- coding:utf-8 -*-# By:Eastmountimport cv2  import numpy as npimport matplotlib.pyplot as plt #读取图片img = cv2.imread('scenery.png')image = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#图像平移#垂直方向 向下平移100M = np.float32([[1, 0, 0], [0, 1, 100]])img1 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))#垂直方向 向上平移100M = np.float32([[1, 0, 0], [0, 1, -100]])img2 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))#水平方向 向右平移100M = np.float32([[1, 0, 100], [0, 1, 0]])img3 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))#水平方向 向左平移100M = np.float32([[1, 0, -100], [0, 1, 0]])img4 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))#循环显示图形titles = [ 'Image1', 'Image2', 'Image3', 'Image4']  images = [img1, img2, img3, img4]  for i in range(4):     plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray')     plt.title(titles[i])     plt.xticks([]),plt.yticks([])  plt.show()

输出结果如图6-4所示,它从四个方向都进行了平移,并且调用subplot()函数将四个子图绘制在一起。

如何分析Python图像处理中的几何变换

三.图像缩放

图像缩放(image scaling)是指对数字图像的大小进行调整的过程。在Python中,图像缩放主要调用resize()函数实现,函数原型如下:

result = cv2.resize(class="lazy" data-src, dsize[, result[. fx[, fy[, interpolation]]]])

– class="lazy" data-src表示原始图像

– dsize表示图像缩放的大小

– result表示图像结果

– fx表示图像x轴方向缩放大小的倍数

– fy表示图像y轴方向缩放大小的倍数

– interpolation表示变换方法。CV_INTER_NN表示最近邻插值;CV_INTER_LINEAR表示双线性插值(缺省使用);

CV_INTER_AREA表示使用像素关系重采样,当图像缩小时,该方法可以避免波纹出现,当图像放大时,类似于CV_INTER_NN;

CV_INTER_CUBIC表示立方插值

常见的图像缩放两种方式如下所示,第一种方式是将原图像设置为(160, 160)像素大小,第二种方式是将原始图像缩小为0.5倍。

  • result = cv2.resize(class="lazy" data-src, (160,160))

  • result = cv2.resize(class="lazy" data-src, None, fx=0.5, fy=0.5)

设(x1, y1)是缩放后的坐标,(x0, y0)是缩放前的坐标,sx、sy为缩放因子,则图像缩放的计算公式(6-3)所示:

如何分析Python图像处理中的几何变换

下面是Python实现图像缩放的代码,它将所读取的风景图像进行缩小。

# -*- coding:utf-8 -*-# By:Eastmountimport cv2  import numpy as np   #读取图片class="lazy" data-src = cv2.imread('scenery.png')#图像缩放result = cv2.resize(class="lazy" data-src, (200,100))print(result.shape)#显示图像cv2.imshow("original", class="lazy" data-src)cv2.imshow("result", result)#等待显示cv2.waitKey(0)cv2.destroyAllWindows()

输出结果如图6-5所示,图像缩小为(100, 200, 3)像素。注意,代码中调用函数 cv2.resize(class="lazy" data-src, (200,100)) 设置新图像大小dsize的列数为200,行数为100。

如何分析Python图像处理中的几何变换

下面讲解另一种图像缩放变换的方法,通过原始图像像素乘以缩放系数进行图像变换,代码如下:

# -*- coding:utf-8 -*-# By:Eastmountimport cv2  import numpy as np   #读取图片class="lazy" data-src = cv2.imread('scenery.png')rows, cols = class="lazy" data-src.shape[:2]print(rows, cols)#图像缩放 dsize(列,行)result = cv2.resize(class="lazy" data-src, (int(cols*0.6), int(rows*1.2)))#显示图像cv2.imshow("class="lazy" data-src", class="lazy" data-src)cv2.imshow("result", result)cv2.waitKey(0)cv2.destroyAllWindows()

获取图片“scenery.png”的元素像素值,其rows值为384,cols值为512,接着进行宽度缩小0.6倍、高度放大1.2倍的处理,运行前后对比效果如图6-6所示。

如何分析Python图像处理中的几何变换

最后讲解调用(fx,fy)参数设置缩放倍数的方法,对原始图像进行放大或缩小操作。下面代码是fx和fy方向缩小至原始图像0.3倍的操作。

# -*- coding:utf-8 -*-# By:Eastmountimport cv2  import numpy as np   #读取图片class="lazy" data-src = cv2.imread('scenery.png')rows, cols = class="lazy" data-src.shape[:2]print(rows, cols)#图像缩放result = cv2.resize(class="lazy" data-src, None, fx=0.3, fy=0.3)#显示图像cv2.imshow("class="lazy" data-src", class="lazy" data-src)cv2.imshow("result", result)#等待显示cv2.waitKey(0)cv2.destroyAllWindows()

输出的结果如图6-7所示,这是按比例0.3×0.3缩小的。

如何分析Python图像处理中的几何变换

四.图像旋转

图像旋转是指图像以某一点为中心旋转一定的角度,形成一幅新的图像的过程。图像旋转变换会有一个旋转中心,这个旋转中心一般为图像的中心,旋转之后图像的大小一般会发生改变。图6-8表示原始图像的坐标(x0, y0)旋转至(x1, y1)的过程。

如何分析Python图像处理中的几何变换

旋转公式如(6-4)所示,其中(m,n)是旋转中心,a是旋转的角度,(left,top)是旋转后图像的左上角坐标。

如何分析Python图像处理中的几何变换

图像旋转变换主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转,函数原型如下:

M = cv2.getRotationMatrix2D(center, angle, scale)

– center表示旋转中心点,通常设置为(cols/2, rows/2)

– angle表示旋转角度,正值表示逆时针旋转,坐标原点被定为左上角

– scale表示比例因子

rotated = cv2.warpAffine(class="lazy" data-src, M, (cols, rows))

– class="lazy" data-src表示原始图像

– M表示旋转参数,即getRotationMatrix2D()函数定义的结果

– (cols, rows)表示原始图像的宽度和高度

实现代码如下所示:

# -*- coding:utf-8 -*-# By:Eastmountimport cv2  import numpy as np   #读取图片class="lazy" data-src = cv2.imread('scenery.png')#源图像的高、宽 以及通道数rows, cols, channel = class="lazy" data-src.shape#绕图像的中心旋转#函数参数:旋转中心 旋转度数 scaleM = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)#函数参数:原始图像 旋转参数 元素图像宽高rotated = cv2.warpAffine(class="lazy" data-src, M, (cols, rows))  #显示图像cv2.imshow("class="lazy" data-src", class="lazy" data-src)cv2.imshow("rotated", rotated)#等待显示cv2.waitKey(0)cv2.destroyAllWindows()

显示效果如图6-9所示,绕图像中心点逆时针旋转30度。

如何分析Python图像处理中的几何变换

看完上述内容,你们对如何分析Python图像处理中的几何变换有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

免责声明:

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

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

如何分析Python图像处理中的几何变换

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

下载Word文档

猜你喜欢

如何分析Python图像处理中的几何变换

今天就跟大家聊聊有关如何分析Python图像处理中的几何变换,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一.图像几何变换图像几何变换不改变图像的像素值,在图像平面上进行像素变换。适
2023-06-29

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

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

如何进行Python OpenCV图像模糊处理分析

这篇文章跟大家分析一下“如何进行Python OpenCV图像模糊处理分析”。内容详细易懂,对“如何进行Python OpenCV图像模糊处理分析”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编
2023-06-26

Python中图像灰度非线性变换的示例分析

这篇文章将为大家详细讲解有关Python中图像灰度非线性变换的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.图像灰度非线性变换原始图像的灰度值按照DB=DA×DA/255的公式进行
2023-06-29

如何在Python中处理图像处理的问题

如何在Python中处理图像处理的问题引言:在如今数字化的时代,图像处理已经成为一个非常重要的领域,广泛应用于计算机视觉、医学图像、图像识别等多个领域。Python作为一种简单易学的编程语言,提供了很多强大的图像处理库和工具,使得图像处理变
2023-10-22

Python中图像量化处理的示例分析

小编给大家分享一下Python中图像量化处理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一.图像量化处理原理量化(Quantization)旨在将图像
2023-06-29

如何基于Python实现图像的傅里叶变换

这篇文章主要介绍了如何基于Python实现图像的傅里叶变换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言首先是本文总体代码,改一下图像的读取路径就可以运行了,但我还是建议
2023-06-22

如何在Python中处理图像识别的问题

如何在Python中处理图像识别的问题,具体代码示例图像识别是人工智能领域中一个重要的应用方向,它的目标是让计算机具备识别图像内容的能力。在Python中,我们可以使用一些开源库来处理图像识别的问题,本文将介绍如何利用OpenCV和Tens
2023-10-22

Python中Pillow库如何进行图像文件处理

小编给大家分享一下Python中Pillow库如何进行图像文件处理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、打开PyCharm,创建一个新的.py文件2、
2023-06-25

如何在Python中进行图像处理和识别

如何在Python中进行图像处理和识别摘要:现代技术使得图像处理和识别在许多领域中成为了一个重要的工具。Python作为一种易于学习和使用的编程语言,具有丰富的图像处理和识别库。本文将介绍如何使用Python进行图像处理和识别,并提供具体的
2023-10-22

Python OpenCV基于霍夫圈变换算法如何检测图像中的圆形

小编给大家分享一下Python OpenCV基于霍夫圈变换算法如何检测图像中的圆形,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!第一章:霍夫变换检测圆① 实例演示
2023-06-22

Python中图像点运算与灰度化处理的示例分析

这篇文章主要介绍了Python中图像点运算与灰度化处理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一.图像点运算概念图像点运算(Point Operation)指
2023-06-29

Python数据分析中如何处理缺失值

小编给大家分享一下Python数据分析中如何处理缺失值,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!让我们首先创建一个示例数据框并向其中添加一些缺失值。我们有一个 10 行 6 列的数据框。下一步是添加缺失值。 我们将使用
2023-06-25

如何在Python中处理图片处理的问题

如何在Python中处理图片处理的问题,需要具体代码示例在如今的数字化时代,图片已经成为人们日常生活中不可或缺的一部分。我们随时随地可以通过手机拍摄、下载网络上的图片。然而,有时我们需要对这些图片进行一些处理,如裁剪、缩放、滤镜等操作。本文
2023-10-22

编程热搜

  • 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动态编译

目录