前言
这次梳理的篇幅主要是涉及图像仿射变换图像翻转,利用python编程实现不同方式的图像翻转,对巩固自己的python知识也是很有帮助的,进一步的对图像处理的内容也是帮助很大的。
但更多的是抛砖引玉,希望对你们有所帮助。
感谢各位鼓励与支持,往期文章都在最后梳理出来了(●'◡'●)
接下来就以问题的形式展开梳理
利用flip函数实现翻转
flip函数原型
opencv中flip函数原型如下:
flip(src, flipCode[, dst]) -> dst
参数解析:
- src 输入图片
- 1 水平翻转 Horizontally (图片第二维度是column)
- 0 垂直翻转 *Vertically * (图片第一维是row)
- -1 同时水平翻转与垂直反转 Horizontally & Vertically
封装函数
为了使用方便, 你也可以封装一下旋转过程:
示例代码:
def flip(image, direction): if direction == "h": flipped = cv2.flip(image, 1) elif direction == "v": flipped = cv2.flip(image, 0) else: # both horizontally and vertically flipped = cv2.flip(image, -1)
具体源码及效果展示
具体源码如下:
'''反转Demo'''import numpy as npimport cv2from matplotlib import pyplot as pltimg = cv2.imread('lena1.jpg')def bgr2rbg(img): ''' 将颜色空间从BGR转换为RBG ''' return img[:,:,::-1]# 水平翻转flip_h = cv2.flip(img, 1)# 垂直翻转flip_v = cv2.flip(img, 0)# 同时水平翻转与垂直翻转flip_hv = cv2.flip(img, -1)plt.subplot(221)plt.title('SRC')plt.imshow(bgr2rbg(img))plt.subplot(222)plt.title('Horizontally')plt.imshow(bgr2rbg(flip_h))plt.subplot(223)plt.title('Vertically')plt.imshow(bgr2rbg(flip_v))plt.subplot(224)plt.title('Horizontally & Vertically')plt.imshow(bgr2rbg(flip_hv))plt.show()
原始图像:
![a46d0ed38916e7959f948edc41170b26.png](https://i-blog.csdnimg.cn/blog_migrate/cb342f1cc3bca0a478ff8c4358e20e93.jpeg)
原始图像
图像翻转图像:
![d3b3e62ba9360a8b6df511702a40f63a.png](https://i-blog.csdnimg.cn/blog_migrate/c2dfed5cc8f0e6e571a1bfc2926e42dd.jpeg)
翻转图像
利用numpy的索引实现翻转
利用numpy中ndarray的索引, 我们可以非常方便地实现图像翻转。
# 水平翻转flip_h = img[:,::-1]# 垂直翻转flip_v = img[::-1]# 水平垂直同时翻转flip_hv = img[::-1, ::-1]
具体源码及效果展示
具体源码如下:
'''使用numpy的索引进行图像反转'''import cv2import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread('lena1.jpg')height,width,channel = img.shape# 水平翻转flip_h = img[:,::-1]# 垂直翻转flip_v = img[::-1]# 水平垂直同时翻转flip_hv = img[::-1, ::-1]def bgr2rbg(img): ''' 将颜色空间从BGR转换为RBG ''' return img[:,:,::-1]plt.subplot(221)plt.title('SRC')plt.imshow(bgr2rbg(img))plt.subplot(222)plt.title('Horizontally')plt.imshow(bgr2rbg(flip_h))plt.subplot(223)plt.title('Vertically')plt.imshow(bgr2rbg(flip_v))plt.subplot(224)plt.title('Horizontally & Vertically')plt.imshow(bgr2rbg(flip_hv))plt.show()
原始图像:
![a46d0ed38916e7959f948edc41170b26.png](https://i-blog.csdnimg.cn/blog_migrate/cb342f1cc3bca0a478ff8c4358e20e93.jpeg)
原始图像
翻转后的图像:
![a5418dcf35996f83884d17d6ef58d76b.png](https://i-blog.csdnimg.cn/blog_migrate/7e02c63c95a853aca48104c1da1b792b.jpeg)
翻转后的图像
利用wrapAffine实现翻转
数学原理推导
注: width 代表图像的宽度; height代表图像的高度
水平翻转的变换矩阵:
![fd7a5375277b41174eb3633f78ad5ac8.png](https://i-blog.csdnimg.cn/blog_migrate/142e83855a4348fbab9a1820a6988448.jpeg)
水平翻转的变换矩阵
垂直翻转的变换矩阵:
![5695870fb4096825c01affb989d334e4.png](https://i-blog.csdnimg.cn/blog_migrate/8481d34b2070d35bda5be633338a11eb.jpeg)
垂直翻转的变换矩阵
同时进行水平翻转与垂直翻转:
![87064bc3fe4a74608bd7fe488e58ab7b.png](https://i-blog.csdnimg.cn/blog_migrate/49248ae55f8cd1b845cd4d35d57f5543.jpeg)
同时进行水平翻转与垂直翻转
具体源码及效果展示
具体源码如下:
'''使用仿射矩阵实现反转'''import cv2import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread('lena1.jpg')height,width,channel = img.shape# 水平翻转M1 = np.float32([[-1, 0, width], [0, 1, 0]])flip_h = cv2.warpAffine(img, M1, (width, height))# 垂直翻转M2 = np.float32([[1, 0, 0], [0, -1, height]])flip_v = cv2.warpAffine(img, M2, (width, height))# 水平垂直同时翻转M3 = np.float32([[-1, 0, width], [0, -1, height]])flip_hv = cv2.warpAffine(img, M3, (width, height))def bgr2rbg(img): ''' 将颜色空间从BGR转换为RBG ''' return img[:,:,::-1]plt.subplot(221)plt.title('SRC')plt.imshow(bgr2rbg(img))plt.subplot(222)plt.title('Horizontally')plt.imshow(bgr2rbg(flip_h))plt.subplot(223)plt.title('Vertically')plt.imshow(bgr2rbg(flip_v))plt.subplot(224)plt.title('Horizontally & Vertically')plt.imshow(bgr2rbg(flip_hv))plt.show()
原始图像:
![a46d0ed38916e7959f948edc41170b26.png](https://i-blog.csdnimg.cn/blog_migrate/cb342f1cc3bca0a478ff8c4358e20e93.jpeg)
原始图像
翻转后的图像:
![fb40556d2f0d3755c009c5fbfa369ca8.png](https://i-blog.csdnimg.cn/blog_migrate/fcea85b6a40cfd75cf9f2890060f0726.jpeg)
翻转后的图像
「❤️ 感谢大家」
如果你觉得这篇内容对你挺有有帮助的话:
- 点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
- 欢迎在留言区与我分享你的想法,也欢迎你在留言区记录你的思考过程。
- 觉得不错的话,也可以阅读近期梳理的文章(感谢各位的鼓励与支持):
- python开发之HighGUI上位机开发(一)(420+[赞])
- python开发之HighGUI上位机开发(二)(680+[赞])
- python开发(三)—项目实战:可变色画布和自制绘图板(580+[赞])
- 教你用python操作Excel、Word、CSV,一文够了(160+[赞])
- 教你用python轻松解析XML和PDF,一文够了,赶紧码住(210+[赞])
- 电脑收藏的10个网站,知乎超100万人推荐,让你办公事半功倍(230+[赞])
- 基于混沌Logistic加密算法的图片加密与还原(220+[赞])
- 分享 | 36张不可思议的数学知识动图,让你对数学怦然心动(600+[赞])
- 手把手教你进行pip换源(100+[赞])
- 聊天小白震撼来临!快用python教她说话吧,你就不寂寞了(240+[赞])
- 教你用python编写二十几行的代码绘制动态烟花(210+[赞])
- Python之Matplotlib数据可视化一:简易线形图(310+[赞])
- Python之Matplotlib可视化二:密度图与等高线图(330+[赞])
- python之图像仿射变换分析:原理+图像平移(310+[赞])
- 超全Python图像处理讲解(多图预警)(340+[赞])
- python之仿射变换分析:图像旋转及数学原理推导(310+[赞])
「❤️ 资源传送门」
1. 扫码关注【做一个柔情的程序猿】公众号
2. 在【做一个柔情的程序猿】后台回复 【python资料】【2020秋招】 获取相应资料