Python图像处理丨带你掌握图像几何变换

摘要:本篇文章主要讲解图像仿射变换和图像透视变换,通过Python调用OpenCV函数实。

本文分享自华为云社区《​​[Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正​​》,作者: eastmount 。

一.图像仿射变换

图像仿射变换又称为图像仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。通常图像的旋转加上拉升就是图像仿射变换,仿射变换需要一个M矩阵实现,但是由于仿射变换比较复杂,很难找到这个M矩阵.

OpenCV提供了根据变换前后三个点的对应关系来自动求解M的函数——cv2.getAffineTransform(pos1,pos2),其中pos1和pos2表示变换前后的对应位置关系,输出的结果为仿射矩阵M,接着使用函数cv2.warpAffine()实现图像仿射变换。图5-14是仿射变换的前后效果图。

Python图像处理丨带你掌握图像几何变换

图像仿射变换的函数原型如下:

[En]

The function prototype of image affine transformation is as follows:

M = cv2.getAffineTransform(pos1,pos2)

  • pos1表示变换前的位置
  • pos2表示变换后的位置

cv2.warpAffine(src, M, (cols, rows))

  • src表示原始图像
  • M表示仿射变换矩阵
  • (rows,cols)表示变换后的图像大小,rows表示行数,cols表示列数

实现代码如下所示:

#encoding:utf-8import cv2import numpy as npimport matplotlib.pyplot as plt#读取图片src = cv2.imread('test.bmp')#获取图像大小rows, cols = src.shape[:2]#设置图像仿射变换矩阵pos1 = np.float32([[50,50], [200,50], [50,200]])pos2 = np.float32([[10,100], [200,50], [100,250]])M = cv2.getAffineTransform(pos1, pos2)#图像仿射变换result = cv2.warpAffine(src, M, (cols, rows))#显示图像cv2.imshow("original", src)cv2.imshow("result", result)#等待显示cv2.waitKey(0)cv2.destroyAllWindows()

输出效果图如下所示:

Python图像处理丨带你掌握图像几何变换

二.图像透视变换

图像透视变换(Perspective Transformation)的本质是将图像投影到一个新的视平面,同理OpenCV通过函数cv2.getPerspectiveTransform(pos1,pos2)构造矩阵M,其中pos1和pos2分别表示变换前后的4个点对应位置。得到M后在通过函数cv2.warpPerspective(src,M,(cols,rows))进行透视变换。

图像透视变换的函数原型如下:

[En]

The function prototype of image perspective transformation is as follows:

M = cv2.getPerspectiveTransform(pos1, pos2)

  • pos1表示透视变换前的4个点对应位置
  • pos2表示透视变换后的4个点对应位置

cv2.warpPerspective(src,M,(cols,rows))

  • src表示原始图像
  • M表示透视变换矩阵
  • (rows,cols)表示变换后的图像大小,rows表示行数,cols表示列数

代码如下:

#encoding:utf-8import cv2import numpy as npimport matplotlib.pyplot as plt#读取图片src = cv2.imread('test01.jpg')#获取图像大小rows, cols = src.shape[:2]#设置图像透视变换矩阵pos1 = np.float32([[114, 82], [287, 156], [8, 322], [216, 333]])pos2 = np.float32([[0, 0], [188, 0], [0, 262], [188, 262]])M = cv2.getPerspectiveTransform(pos1, pos2)#图像透视变换result = cv2.warpPerspective(src, M, (190, 272))#显示图像cv2.imshow("original", src)cv2.imshow("result", result)#等待显示cv2.waitKey(0)cv2.destroyAllWindows()

输出结果如下图所示:

Python图像处理丨带你掌握图像几何变换

三.基于图像透视变换的图像校正

下面参考 ​​​t6_17大神​;​ 的文章,通过图像透视变换实现图像校正功能。

假设现在存在一张A4纸图像,现在需要通过调用图像透视变换校正图像。

Python图像处理丨带你掌握图像几何变换

代码如下所示:

#encoding:utf-8import cv2import numpy as npimport matplotlib.pyplot as plt#读取图片src = cv2.imread('test01.jpg')#获取图像大小rows, cols = src.shape[:2]#将源图像高斯模糊img = cv2.GaussianBlur(src, (3,3), 0)#进行灰度化处理gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#边缘检测(检测出图像的边缘信息)edges = cv2.Canny(gray,50,250,apertureSize = 3)cv2.imwrite("canny.jpg", edges)#通过霍夫变换得到A4纸边缘lines = cv2.HoughLinesP(edges,1,np.pi/180,50,minLineLength=90,maxLineGap=10)#下面输出的四个点分别为四个顶点for x1,y1,x2,y2 in lines[0]: print(x1,y1),(x2,y2)for x1,y1,x2,y2 in lines[1]: print(x1,y1),(x2,y2)#绘制边缘for x1,y1,x2,y2 in lines[0]:    cv2.line(gray, (x1,y1), (x2,y2), (0,0,255), 1)#根据四个顶点设置图像透视变换矩阵pos1 = np.float32([[114, 82], [287, 156], [8, 322], [216, 333]])pos2 = np.float32([[0, 0], [188, 0], [0, 262], [188, 262]])M = cv2.getPerspectiveTransform(pos1, pos2)#图像透视变换result = cv2.warpPerspective(src, M, (190, 272))#显示图像cv2.imshow("original", src)cv2.imshow("result", result)#等待显示cv2.waitKey(0)cv2.destroyAllWindows()

运行结果如下图所示:

Python图像处理丨带你掌握图像几何变换

Python图像处理丨带你掌握图像几何变换

四.图像几何变换总结

最后,我们补充了图像几何代码的所有变换,希望读者能理解并实践相关代码。输出以女神为例:

[En]

Finally, we supplement all the transformations of the image geometry code, hoping that the reader can understand the relevant code and practice it. The output takes the goddess as an example:

Python图像处理丨带你掌握图像几何变换

完整代码如下:

#encoding:utf-8import cv2  import numpy as npimport matplotlib.pyplot as plt#读取图片img = cv2.imread('test3.jpg')image = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#图像平移矩阵M = np.float32([[1, 0, 80], [0, 1, 30]])rows, cols = image.shape[:2]img1 = cv2.warpAffine(image, M, (cols, rows))#图像缩小img2 = cv2.resize(image, (200,100))#图像放大img3 = cv2.resize(image, None, fx=1.1, fy=1.1)#绕图像的中心旋转#源图像的高、宽 以及通道数rows, cols, channel = image.shape#函数参数:旋转中心 旋转度数 scaleM = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1) #函数参数:原始图像 旋转参数 元素图像宽高img4 = cv2.warpAffine(image, M, (cols, rows))#图像翻转img5 = cv2.flip(image, 0) #参数=0以X轴为对称轴翻转 img6 = cv2.flip(image, 1) #参数>0以Y轴为对称轴翻转#图像的仿射pts1 = np.float32([[50,50],[200,50],[50,200]])pts2 = np.float32([[10,100],[200,50],[100,250]])M = cv2.getAffineTransform(pts1,pts2)img7 = cv2.warpAffine(image, M, (rows,cols))#图像的透射pts1 = np.float32([[56,65],[238,52],[28,237],[239,240]])pts2 = np.float32([[0,0],[200,0],[0,200],[200,200]])M = cv2.getPerspectiveTransform(pts1,pts2)img8 = cv2.warpPerspective(image,M,(200,200))#循环显示图形titles = [ 'source', 'shift', 'reduction', 'enlarge', 'rotation', 'flipX', 'flipY', 'affine', 'transmission'] images = [image, img1, img2, img3, img4, img5, img6, img7, img8] for i in xrange(9):  plt.subplot(3, 3, i+1), plt.imshow(images[i], 'gray')  plt.title(titles[i])  plt.xticks([]),plt.yticks([]) plt.show()

点击关注,第一时间了解华为云新鲜技术~

Original: https://blog.51cto.com/u_15214399/5571879
Author: 华为云开发者联盟
Title: Python图像处理丨带你掌握图像几何变换

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

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

(0)

大家都在看

  • Python Matplotlib 3D绘图详解(汇总)

    Python Matplotlib 3D绘图详解(汇总) 最初开发的 Matplotlib,仅支持绘制 2d 图形,后来随着版本的不断更新, Matplotlib 在二维绘图的基础…

    Python 2023年8月30日
    082
  • linux 下 nginx+ uwsgi + Django 环境配置(亲测可用)

    前提条件 nginx 安装:nginx 一键安装脚本https://blog.csdn.net/zxp3817100/article/details/53736100 ; pyth…

    Python 2023年8月4日
    0122
  • 神了,用 Python 预测世界杯决赛,发现准确率还挺高

    那么四年一度的世界杯即将要在卡塔尔开幕了,对于不少热爱足球运动的球迷来说,这可是十分难得的盛宴,而对于最后大力神杯的归属,相信很多人都满怀着期待,每个人心中都有不同的答案。 今天我…

    Python 2023年8月3日
    0100
  • Pandas之十数据分类

    关注微信公众号:数据研发技术,点击菜单:PY宝典,查看往期精彩内容 Pandas中为数据分类的需求提供专门的类型 category,可以由多种方式创建,并结合dataframe或S…

    Python 2023年8月7日
    087
  • 【DataWhale数据分析】第一章:第三节探索性数据分析

    复习: 在前面我们已经学习了Pandas基础,知道利用Pandas读取csv数据的增删查改,今天我们要学习的就是 探索性数据分析,主要介绍如何利用Pandas进行排序、算术计算以及…

    Python 2023年8月8日
    0102
  • 【Python基础】reduce函数详解

    转载请注明出处:【Python基础】reduce函数详解 reduce函数原本在 python2中也是个内置函数,不过在 python3中被移到 functools模块中。 red…

    Python 2023年8月1日
    0106
  • 火遍全网的chatGPT(文末有彩蛋)

    最近网上非常火爆的CHATGPT,它是OpenAI开发的一款开源的自然语言处理 (NLP) 模型,用于实现对话生成和语言模型预测。CHATGPT 模型基于 GPT-3 (Gener…

    Python 2023年9月30日
    078
  • 【Python】利用matplotlib在Pycharm中显示本地图片

    前言 近来在做绘图的工作,结果是会导出一张 png图片,但苦于每次都要点击图片才能查看。为解决这一痛点,遂有此文 图片显示 鄙人有一图,名为 因&#x…

    Python 2023年8月30日
    0105
  • 【pandas教程】时间的处理

    时间序列TimeSries rng = pd.date_range(‘1/1/2012′, periods=100, freq=’S’) ts = pd.Series(np.ran…

    Python 2023年8月7日
    0112
  • 【Java】Java中的零拷贝

    物理内存 计算机物理内存条的容量,比如我们买电脑会关注内存大小有多少G,这个容量就是计算机的物理内存。 虚拟内存 操作系统为每个进程分配了独立的虚拟地址空间,也就是虚拟内存,虚拟地…

    Python 2023年10月18日
    097
  • 【机器学习】李宏毅——Transformer

    Transformer具体就是属于Sequence-to-Sequence的模型,而且 输出的向量的长度并不能够确定,应用场景如语音辨识、机器翻译,甚至是语音翻译等等,在文字上的话…

    Python 2023年10月12日
    088
  • 在CPU上跑yolov5(详细步骤+适合入门)

    目录 一、创建新环境 二、导入Pytorch库 三、新建项目 四、测试 五、准备数据集 六、修改配置文件 七、训练 八、实例测试 九、结束语 默认大家都装好了Anaconda和Py…

    Python 2023年7月31日
    0131
  • C++程序运行Python脚本调试记录

    目录 背景: 遇到的问题: 1. 找不到python39_d.dll 2. 多个python环境下使用指定的pip 3. 导入numpy报错:Original error was:…

    Python 2023年8月27日
    082
  • python 相似性计算方法 – 余弦相似度,皮尔逊相关系数

    目录 余弦相似度 使用sklearn计算 使用scipy计算 使用numpy计算 皮尔逊相关系数 使用numpy计算 使用scipy计算 余弦相似度 是通过计算两个向量的夹角余弦值…

    Python 2023年8月23日
    077
  • Flask 框架:运用Echarts绘制图形

    echarts是百度推出的一款开源的基于 JavaScript的可视化图表库,该开发库目前发展非常不错,且支持各类图形的绘制可定制程度高,Echarts绘图库同样可以与 Flask…

    Python 2023年10月20日
    097
  • DataFrame数据分析

    注:文中用到的数据文件可以在资源中免费获取。 基本统计 常用统计函数表 非空元素计算 最小值 最大值 最小值的位置 最大值的位置 )10%分位数 中位数 标准差 平均绝对偏差 一次…

    Python 2023年8月18日
    081
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球