Python图像处理六。图像缩放图像旋转图像翻转与图像平移
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大
少走了弯路,也就错过了风景,无论如何,感谢经历
更多关于Android安全的知识,可前往:https://blog.csdn.net/ananasorangey/category11955914.html
本篇文章转载自公众号[娜璋AI安全之家]
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类、目标检测应用。
前一篇文章介绍Python调用OpenCV实现图像融合、图像加减法、图像逻辑运算和类型转换。这篇文章将详细讲解图像缩放、图像旋转、图像翻转、图像平移。希望文章对您有所帮助,如果有不足之处,还请海涵~ 一.图像缩放 二.图像旋转 三.图像翻转 四.图像平移
该系列在github所有源代码: https://github.com/eastmountyxz/ ImageProcessing-Python
前文回顾(下面的超链接可以点击喔): [Python图像处理] 一.图像处理基础知识及OpenCV入门函数 [Python图像处理] 二.OpenCV+Numpy库读取与修改像素 [Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理 [Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波、中值滤波及双边滤波 [Python图像处理] 五.图像融合、加法运算及图像类型转换 [Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移
学Python近八年,认识了很多大佬和朋友,感恩。由于在外求学且需要养娃,故在CSDN设置成了最低价收费专栏,觉得不错的可以购买抬爱;但作者的本意是帮助更多初学者入门,因此在github开源了所有代码,也在公众号同步更新。深知自己很菜,得拼命努力前行,编程也没有什么捷径,干就对了。希望未来能更透彻学习和撰写文章,同时非常感谢参考文献中的大佬们的文章和分享,共勉。
- https://blog.csdn.net/eastmount 一.图像缩放
图像缩放主要调用resize()函数实现,具体如下: result = cv2.resize(src, dsize[, result[. fx[, fy[, interpolation]]]])
其中src表示原始图像,dsize表示缩放大小,fx和fy也可以表示缩放大小倍数,他们两个(dsize或fxfy)设置一个即可实现图像缩放。例如: result = cv2.resize(src, (160,160)) result = cv2.resize(src, None, fx=0.5, fy=0.5)
图像缩放:设(x0, y0)是缩放后的坐标,(x, y)是缩放前的坐标,sx、sy为缩放因子,则公式如下:
代码示例如下所示: #encoding:utf-8 import cv2 import numpy as np #读取图片 src = cv2.imread("test.jpg") #图像缩放 result = cv2.resize(src, (200,100)) print(result.shape) #显示图像 cv2.imshow("src", src) cv2.imshow("result", result) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果如下图所示,图像缩小为(200,100)像素。
需要注意的是,代码中 cv2.resize(src, (200,100)) 设置的dsize是列数为200,行数为100。
同样,可以获取原始图像像素再乘以缩放系数进行图像变换,代码如下所示。 #encoding:utf-8 import cv2 import numpy as np #读取图片 src = cv2.imread("test.jpg") rows, cols = src.shape[:2] print(rows, cols) #图像缩放 dsize(列,行) result = cv2.resize(src, (int(cols*0.6), int(rows*1.2))) #显示图像 cv2.imshow("src", src) cv2.imshow("result", result) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果如下图所示:
最后讲解(fx,fy)缩放倍数的方法对图像进行放大或缩小。 #encoding:utf-8 import cv2 import numpy as np #读取图片 src = cv2.imread("test.jpg") rows, cols = src.shape[:2] print(rows, cols) #图像缩放 result = cv2.resize(src, None, fx=0.3, fy=0.3) #显示图像 cv2.imshow("src", src) cv2.imshow("result", result) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
最后输出的结果如下图所示,这是按例比0.3*0.3缩小的。
二.图像旋转
图像旋转主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转,具体如下: M = cv2.getRotationMatrix2D( (cols/2, rows/2), 30, 1)
参数分别为:旋转中心、旋转度数、scalerotated = cv2.warpAffine( src, M, (cols, rows))
参数分别为:原始图像、旋转参数、原始图像宽高
图像旋转:设(x0, y0)是旋转后的坐标,(x, y)是旋转前的坐标,(m,n)是旋转中心,a是旋转的角度,(left,top)是旋转后图像的左上角坐标,则公式如下:
代码如下所示: #encoding:utf-8 import cv2 import numpy as np #读取图片 src = cv2.imread("test.jpg") #原图的高、宽 以及通道数 rows, cols, channel = src.shape #绕图像的中心旋转 #参数:旋转中心 旋转度数 scale M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1) #参数:原始图像 旋转参数 元素图像宽高 rotated = cv2.warpAffine(src, M, (cols, rows)) #显示图像 cv2.imshow("src", src) cv2.imshow("rotated", rotated) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果如下图所示:
如果设置-90度,则核心代码和图像如下所示。 M = cv2.getRotationMatrix2D( (cols/2, rows/2), -90, 1) rotated = cv2.warpAffine( src, M, (cols, rows))
三.图像翻转
图像翻转在OpenCV中调用函数flip()实现,原型如下: dst = cv2.flip(src, flipCode)
其中src表示原始图像,flipCode表示翻转方向,如果flipCode为0,则以X轴为对称轴翻转,如果fliipCode>0则以Y轴为对称轴翻转,如果flipCode<0则在X轴、Y轴同时翻转。
代码如下所示: #encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt #读取图片 img = cv2.imread("test.jpg") src = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #图像翻转 #0以X轴为对称轴翻转 >0以Y轴为对称轴翻转 <0X轴Y轴翻转 img1 = cv2.flip(src, 0) img2 = cv2.flip(src, 1) img3 = cv2.flip(src, -1) #显示图形 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()
输出结果如下图所示:
四.图像平移
图像平移:设(x0, y0)是缩放后的坐标,(x, y)是缩放前的坐标,dx、dy为偏移量,则公式如下:
图像平移首先定义平移矩阵M,再调用warpAffine()函数实现平移,核心函数如下: M = np.float32([[1, 0, x], [0, 1, y]]) shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
完整代码如下所示: #encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt #读取图片 img = cv2.imread("test.jpg") image = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #图像平移 下、上、右、左平移 M = np.float32([[1, 0, 0], [0, 1, 100]]) img1 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) M = np.float32([[1, 0, 0], [0, 1, -100]]) img2 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) M = np.float32([[1, 0, 100], [0, 1, 0]]) img3 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) M = 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()
输出结果如下图所示:
五.总结
本文主要讲解Python和OpenCV的图像基础处理,具体内容包括: 一.图像缩放 二.图像旋转 三.图像翻转 四.图像平移
回想2018年当时写这篇文章的感言,不错!
三尺讲台,三寸舌,
三千桃李,三杆笔。
再累再苦,站在讲台前就是最美的自己,几个月的烦恼和忧愁都已消失,真的好享受这种状态,仿佛散着光芒,终于给低年级的同学上课了越早培养编程兴趣越好,恨不能倾囊相授。即使当一辈子的教书匠,平平淡淡也喜欢,而且总感觉给学生讲课远不是课酬和职称所能比拟,这就是所谓的事业,所谓的爱好。
源代码下载地址,记得帮忙点star和关注喔! https://github.com/eastmountyxz/ ImageProcessing-Python
2020年8月18新开的"娜璋AI安全之家",主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。
(By:Eastmount 2021-03-16 夜于武汉 )
参考文献,在此感谢这些大佬,共勉! [1] 冈萨雷斯. 数字图像处理(第3版)[M]. 电子工业出版社, 2013. [2] 毛星云, 冷雪飞. OpenCV3编程入门[M]. 电子工业出版社, 2015. [3] https://blog.csdn.net/Eastmount
你以为你有很多路可以选择,其实你只有一条路可以走