网站首页 > 技术文章 正文
前言
这次梳理的篇幅主要是涉及图像仿射变换的原理以及图像平移,利用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 cv2
import numpy as np
img = 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 cv2
import numpy as np
img = 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 shifted
shifted = 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秋招】 获取相应资料
猜你喜欢
- 2025-03-29 Python + Pytest 测试框架——数据驱动
- 2025-03-29 Python实现基于地图四色原理的遗传算法(GA)自动着色
- 2025-03-29 LightGBM算法解释及举例python(lbg算法例题)
- 2025-03-29 K-Means算法原理及其python实现(学习笔记)
- 2025-03-29 Python虚拟机运行原理及加载流程(虚拟机配置python环境)
- 2025-03-29 原理+代码|Python实战多元线性回归模型
- 2025-03-29 Python内置装饰器:深入理解其原理和应用
- 2025-03-29 Python网络爬虫原理解构,原来如此简单!
- 2025-03-29 Python常用算法学习(4) 数据结构(原理+代码)-最全总结
- 2025-03-29 「监督学习」机器学习线性回归模型的基本原理
- 05-25Python 3.14 t-string 要来了,它与 f-string 有何不同?
- 05-25Python基础元素语法总结
- 05-25Python中的变量是什么东西?
- 05-25新手常见的python报错及解决方案
- 05-2511-Python变量
- 05-2510个每个人都是需要知道Python问题
- 05-25Python编程:轻松掌握函数定义、类型及其参数传递方式
- 05-25Python基础语法
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 91℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 81℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)