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

Posted Eastmount

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)相关的知识,希望对你有一定的参考价值。

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

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

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

文章目录

下载地址:

前文赏析:

第一部分 基础语法

第二部分 网络爬虫

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

第四部分 Python图像处理基础

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

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

第七部分 NLP与文本挖掘

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

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

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

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

作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。


一.图像镜像

图像镜像是图像旋转变换的一种特殊情况,通常包括垂直方向和水平方向的镜像。水平镜像通常是以原图像的垂直中轴为中心,将图像分为左右两部分进行堆成变换。如图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端或手机端图像处理应用常见的算法,读者可以尝试结合这些应用完成一套图像处理软件。

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

这周的留言感慨~

十二年CSDN的博客分享,如果要说分享最让我开心的是什么?不是传道,不是授业,也不是解惑,而是接下来这类事。这些年已经陆续鼓励了一些朋友当老师,而昨天得知这一位博友真的去到新疆南疆成为了一名小学老师,我很是感动,是真的感动,六年前我曾鼓励他如果想,就放弃高额工资的互联网大厂,去做自己想做的,没想到已经当了四年老师。又当爹又当妈,国语普及,文化教育,这里面的艰辛不是一两句道得清,除了佩服就是鼓励。
正如你说的一样,“一辈子总得做点有意义的事情,生命实在太短暂,一定要活得积极、正面”。或许,这也是我在CSDN分享博客的最大意义,再比如云南那位老友的留言,“农村的孩子下雨没有伞,只能拼命奔跑”,希望你以后也能成为一名教师,感恩有你们,感谢有你们。我也希望自己早日毕业回到家乡,花上三四十年做好两件事,一是认真教书,二是将少数民族文物抢救和文字语音保护做好,也鼓励更多人一起加入进来。自己虽然很菜吧,但还是有一些喜欢的事,尤其陪伴爱的人,挺好,爱你们喔。2022年继续加油,在CSDN分享更高质量的博客和专栏。

(By:娜璋之家 Eastmount 2022-01-27 夜于贵阳 https://blog.csdn.net/Eastmount )


参考文献:

  • [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.

以上是关于[Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)的主要内容,如果未能解决你的问题,请参考以下文章

[Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)

[Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形

[Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制

[Python从零到壹] 五十九.图像增强及运算篇之图像锐化ScharrCannyLOG实现边缘检测

[Python从零到壹] 四十九.图像增强及运算篇之顶帽运算和底帽运算

[Python从零到壹] 四十九.图像增强及运算篇之顶帽运算和底帽运算