[Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)

举报
eastmount 发表于 2022/04/24 23:31:28 2022/04/24
【摘要】 欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。上一篇文章介绍图像几何变换,包括图像平移、图像缩放和图像旋转。这篇文章将继续讲解图像几何变换,包括图像镜像、图像仿射和图像透视。希望文章对您有所帮助,如果有不足之处,还请海涵。

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。

该系列文章主要讲解Python OpenCV图像处理和图像识别知识,前期主要讲解图像处理基础知识、OpenCV基础用法、常用图像绘制方法、图像几何变换等,中期讲解图像处理的各种运算,包括图像点运算、形态学处理、图像锐化、图像增强、图像平滑等,后期研究图像识别、图像分割、图像分类、图像特效处理以及图像处理相关应用。

上一篇文章介绍图像几何变换,包括图像平移、图像缩放和图像旋转。这篇文章将继续讲解图像几何变换,包括图像镜像、图像仿射和图像透视。希望文章对您有所帮助,如果有不足之处,还请海涵。

下载地址:

前文赏析:

第一部分 基础语法

第二部分 网络爬虫

第三部分 数据分析和机器学习

  • [Python从零到壹] 十九.可视化分析之热力图和箱图绘制及应用详解
  • [Python从零到壹] 二十.可视化分析之Seaborn绘图万字详解
  • [Python从零到壹] 二十一.可视化分析之Pyechart绘图万字详解
  • [Python从零到壹] 二十二.可视化分析之OpenGL绘图万字详解
  • [Python从零到壹] 二十三.十大机器学习算法之决策树分类分析详解(1)
  • [Python从零到壹] 二十四.十大机器学习算法之KMeans聚类分析详解(2)
  • [Python从零到壹] 二十五.十大机器学习算法之KNN算法及图像分类详解(3)
  • [Python从零到壹] 二十六.十大机器学习算法之朴素贝叶斯算法及文本分类详解(4)
  • [Python从零到壹] 二十七.十大机器学习算法之线性回归算法分析详解(5)
  • [Python从零到壹] 二十八.十大机器学习算法之SVM算法分析详解(6)
  • [Python从零到壹] 二十九.十大机器学习算法之随机森林算法分析详解(7)
  • [Python从零到壹] 三十.十大机器学习算法之逻辑回归算法及恶意请求检测应用详解(8)
  • [Python从零到壹] 三十一.十大机器学习算法之Boosting和AdaBoost应用详解(9)
  • [Python从零到壹] 三十二.十大机器学习算法之层次聚类和树状图聚类应用详解(10)

第四部分 Python图像处理基础

第五部分 Python图像运算和图像增强

第六部分 Python图像识别和图像处理经典案例

第七部分 NLP与文本挖掘

第八部分 人工智能入门知识

第九部分 网络攻防与AI安全

第十部分 知识图谱构建实战

扩展部分 人工智能高级案例


一.图像镜像

图像镜像是图像旋转变换的一种特殊情况,通常包括垂直方向和水平方向的镜像。水平镜像通常是以原图像的垂直中轴为中心,将图像分为左右两部分进行堆成变换。如图7-1所示:

在这里插入图片描述

垂直镜像通常是以原图像的水平中轴线为中心,将图像划分为上下两部分进行堆成变换的过程,示意图如图7-2所示。

在这里插入图片描述

在Python中主要调用OpenCV的flip()函数实现图像镜像变换,函数原型如下:

  • dst = cv2.flip(src, flipCode)
    – src表示原始图像
    – flipCode表示翻转方向,如果flipCode为0,则以X轴为对称轴翻转,如果fliipCode>0则以Y轴为对称轴翻转,如果flipCode<0则在X轴、Y轴方向同时翻转。

下面代码是实现三个方向的翻转。

# -*- coding:utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np
import matplotlib.pyplot as plt
 
#读取图片
img = cv2.imread('scenery.png')
src = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#图像翻转
img1 = cv2.flip(src, 0)   #参数=0以X轴为对称轴翻转 
img2 = cv2.flip(src, 1)   #参数>0以Y轴为对称轴翻转
img3 = cv2.flip(src, -1)  #参数<0以X轴和Y轴翻转

#显示图形
titles = ['Source', 'Image1', 'Image2', 'Image3']
images = [src, img1, img2, img3]
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()

输出结果如图7-3所示,图中“Source”为原始图像,“Image1”为以X轴为对称轴翻转或垂直镜像,“Image2”为以Y轴为对称轴翻转或水平镜像,“Images3”为以X轴和Y轴翻转。

在这里插入图片描述


二.图像仿射

图像仿射变换又称为图像仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。通常图像的旋转加上拉升就是图像仿射变换,仿射变换需要一个M矩阵实现,但是由于仿射变换比较复杂,很难找到这个M矩阵,OpenCV提供了根据变换前后三个点的对应关系来自动求解M的函数:

  • cv2.getAffineTransform(pos1,pos2)

其中pos1和pos2表示变换前后的对应位置关系,输出的结果为仿射矩阵M,接着使用函数cv2.warpAffine()实现图像仿射变换。图7-4是仿射变换的前后效果图。

在这里插入图片描述

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

  • M = cv2.getAffineTransform(pos1,pos2)
    – pos1表示变换前的位置
    – pos2表示变换后的位置

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

实现代码如下所示:

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt

#读取图片
src = cv2.imread('scenery.png')

#获取图像大小
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()

输出结果如图7-5所示:

在这里插入图片描述


三.图像透视

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

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

  • M = cv2.getPerspectiveTransform(pos1, pos2)
    – pos1表示透视变换前的4个点对应位置
    – pos2表示透视变换后的4个点对应位置

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

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

在这里插入图片描述

图像透视变换的校正代码如下所示,代码中pos1表示透视变换前A4纸的四个顶点,pos2表示透视变换后A4纸的四个顶点。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt

#读取图片
src = cv2.imread('transform.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()

最终输出结果如图7-7所示,它将图形校正显示。

在这里插入图片描述


四.总结

本章主要讲解Python和OpenCV的图像几何变换,详细介绍了图像镜像、图像仿射和图像透视,包括歪曲图像纠正的案例,希望大家喜欢。此外,这些知识点也是我们PC端或手机端图像处理应用常见的算法,读者可以尝试结合这些应用完成一套图像处理软件。

最近寒假日更,为了感谢读者。同时感谢在求学路上的同行者,不负遇见,勿忘初心。图像处理系列主要包括三部分,分别是:

在这里插入图片描述

在这里插入图片描述

请添加图片描述


感谢在求学路上的同行者,不负遇见,勿忘初心。

感恩能与大家在华为云遇见!
希望能与大家一起在华为云社区共同成长,原文地址:https://blog.csdn.net/Eastmount/article/details/122746238

(By:娜璋之家 Eastmount 2022-04-24 夜于武汉)


参考文献:

  • [1]冈萨雷斯. 数字图像处理(第3版)[M]. 北京:电子工业出版社, 2013.
  • [2]阮秋琦. 数字图像处理学(第3版)[M]. 北京:电子工业出版社,2008.
  • [3]毛星云, 冷雪飞. OpenCV3编程入门[M]. 北京:电子工业出版社, 2015.
  • [4]Eastmount. [Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移[EB/OL]. (2018-09-06). https://blog.csdn.net/Eastmount/article/details/82454335.
  • [5]Eastmount. [数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解[EB/OL]. (2015-06-04). https://blog.csdn.net/Eastmount/article/details/46345299.
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。