opencv 仿射变换_python之图像仿射变换分析:原理+图像平移

6dd72fd42b67192f5ab7970bb9343ba8.png

前言

这次梳理的篇幅主要是涉及图像仿射变换的原理以及图像平移,利用python编程实现不同方式的图像平移,对巩固自己的python知识也是很有帮助的,进一步的对图像处理的内容也是帮助很大的。

但更多的是抛砖引玉,希望对你们有所帮助。

感谢各位鼓励与支持,往期文章都在最后梳理出来了(●'◡'●)

接下来就以问题的形式展开梳理

仿射变换简介

图像上的仿射变换,「其实就是图片中的一个像素点,通过某种变换,移动到另外一个地方。从数学上来讲, 就是一个向量空间进行一次线性变换并加上平移向量, 从而变换到另外一个向量空间的过程」

仿射变换数学原理

向量空间m : m=(x,y)

向量空间n : n=(x′,y′)

向量空间从m到n的变换 n=A∗m+b

整理得到:

eb8b33c65dab0eedc966325ba974723d.png

将A跟b 组合在一起就组成了仿射矩阵 M。它的维度是2∗3

e66927d19ee39f77317eca197b482ff1.png

使用不同的矩阵M,就获得了不同的2D仿射变换效果。

opencv中,实现2D仿射变换, 需要借助warpAffine 函数。

cv2.warpAffine(image, M, (image.shape[1], image.shape[0])

接下来,带你结合具体的2D仿射变换,分析其变换矩阵。


图像平移

数学公式推导

平移可以说是最简单的一种空间变换。其表达式为:

1dfe770436d5a97f60cc8431696d7241.png

平移表达式

其中(b0,b1) 是偏移量。

那我们看看图像平移的一个简单数学例程吧

如果是向右平移10个像素, 向下平移30个像素的话, 那么变换矩阵M可以为:

1ae69cc2f0c9d5c76cff11fd8af6db78.png

变换矩阵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)

原始图像:

ce892f019108243848a25d636fe58954.png

原始图像

向右平移10个像素, 向下平移30个像素图像:

9412a2e8f319ee2f2332ed8704e7b41e.png

向右平移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)

原始图像:

ce892f019108243848a25d636fe58954.png

原始图像

向左平移10个像素, 向上平移30个像素图像:

376fe92dda1a9fc2e60ec76a5502a58b.png

向左平移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)

运行效果

运行代码,在后台显示结果如下:

73d0ee129e1f7f42a963d2579e081258.png

「❤️ 感谢大家」

如果你觉得这篇内容对你挺有有帮助的话:

  1. 点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
  2. 欢迎在留言区与我分享你的想法,也欢迎你在留言区记录你的思考过程。
  3. 觉得不错的话,也可以阅读近期梳理的文章(感谢各位的鼓励与支持):
  • 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秋招】 获取相应资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值