程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

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

hfteth 2025-03-29 17:48:01 技术文章 8 ℃


前言

这次梳理的篇幅主要是涉及图像仿射变换的原理以及图像平移,利用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)

运行效果

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


「 感谢大家」

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

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

「 资源传送门」

1. 扫码关注【做一个柔情的程序猿】公众号

2. 在【做一个柔情的程序猿】后台回复 【python资料】【2020秋招】 获取相应资料

Tags:

最近发表
标签列表