前言
这次梳理的篇幅主要是涉及图像仿射变换的原理以及图像平移,利用python编程实现不同方式的图像平移,对巩固自己的python知识也是很有帮助的,进一步的对图像处理的内容也是帮助很大的。
但更多的是抛砖引玉,希望对你们有所帮助。
感谢各位鼓励与支持,往期文章都在最后梳理出来了(●'◡'●)
接下来就以问题的形式展开梳理
仿射变换简介
图像上的仿射变换,「其实就是图片中的一个像素点,通过某种变换,移动到另外一个地方。从数学上来讲, 就是一个向量空间进行一次线性变换并加上平移向量, 从而变换到另外一个向量空间的过程」。
仿射变换数学原理
向量空间m : m=(x,y)
向量空间n : n=(x′,y′)
向量空间从m到n的变换 n=A∗m+b
整理得到:
将A跟b 组合在一起就组成了仿射矩阵 M。它的维度是2∗3
使用不同的矩阵M,就获得了不同的2D仿射变换效果。
在opencv中,实现2D仿射变换, 需要借助warpAffine 函数。
cv2.warpAffine(image, M, (image.shape[1], image.shape[0])
接下来,带你结合具体的2D仿射变换,分析其变换矩阵。
图像平移
数学公式推导
平移可以说是最简单的一种空间变换。其表达式为:
其中(b0,b1) 是偏移量。
那我们看看图像平移的一个简单数学例程吧
如果是向右平移10个像素, 向下平移30个像素的话, 那么变换矩阵M可以为:
左右平移某个像素都是通过「变换矩阵」来展现,不同的像素值就有不同的变换矩阵。在后面的python编程过程中也是通过变换矩阵来实现相应的图像平移过程。
向右平移10个像素,向下平移30个像素
向右平移10个像素, 向下平移30个像素:
import cv2import numpy as npimg = cv2.imread('lena1.jpg')height,width,channel = img.shape# 声明变换矩阵 向右平移10个像素, 向下平移30个像素M = np.float32([[1, 0, 10], [0, 1, 30]])# 进行2D 仿射变换shifted = cv2.warpAffine(img, M, (width, height))cv2.imwrite('shift_right_10_down_30.jpg', shifted)
原始图像:
向右平移10个像素, 向下平移30个像素图像:
向左平移10个像素,向上平移30个像素
向左平移10个像素, 向上平移30个像素:
# 声明变换矩阵 向左平移10个像素, 向上平移30个像素M = np.float32([[1, 0, -10], [0, 1, -30]])# 进行2D 仿射变换shifted = cv2.warpAffine(img, M, (width, height))cv2.imwrite('shift_right_-10_down_-30.jpg', shifted)
原始图像:
向左平移10个像素, 向上平移30个像素图像:
图像平移V2
函数封装
我们可以用translate这个函数把这个操作封装一下:
def translate(image, x, y): M = np.float32([[1, 0, x], [0, 1, y]]) shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) return shifted
完整演示代码
用translate这个函数把这个操作封装之后的完整代码如下:
import cv2import numpy as npimg = cv2.imread('cat.png')def translate(image, x, y): M = np.float32([[1, 0, x], [0, 1, y]]) shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) return shiftedshifted = translate(img, 10, 30)cv2.imwrite('shift_right_10_down_30.png', shifted)
运行效果
运行代码,在后台显示结果如下:
「❤️ 感谢大家」
如果你觉得这篇内容对你挺有有帮助的话:
- 点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
- 欢迎在留言区与我分享你的想法,也欢迎你在留言区记录你的思考过程。
- 觉得不错的话,也可以阅读近期梳理的文章(感谢各位的鼓励与支持):
- 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+)
「❤️ 资源传送门」
1. 扫码关注【做一个柔情的程序猿】公众号
2. 在【做一个柔情的程序猿】后台回复 【python资料】【2020秋招】 获取相应资料