一文搞懂仿射变换(代码片段)

修炼之路 修炼之路     2023-01-16     487

关键词:

导读

在图像处理中,我们经常需要对图像进行各种操作如平移、缩放、旋转、翻转等,这些其实都是图像的仿射变换。通过本篇文章,你能够知道它们的实现原理以及如何应用它们。

仿射变换

仿射变换也称仿射投影,是指几何中,对一个向量空间进行线性变换并接上一个平移,变换为另一个向量空间。所以,仿射变换其实也就是再讲如何来进行两个向量空间的变换
假设有一个向量空间 k k k
k = ( x , y ) k=(x,y) k=(x,y)
还有一个向量空间 j j j
j = ( x ′ , y ′ ) j=(x',y') j=(x,y)
如果我们想要将向量空间由 k k k变为 j j j,可以通过下面的公式进行变换
j = k ∗ w + b j = k* w + b j=kw+b
将上式进行拆分可得
x ′ = w 00 ∗ x + w 01 ∗ y + b 0 y ′ = w 10 ∗ x + w 11 ∗ y + b 1 x'=w_00*x+w_01*y+b_0 \\\\ y'=w_10*x+w_11*y+b_1 x=w00x+w01y+b0y=w10x+w11y+b1
我们再将上式转换为矩阵的乘法
[ x ′ y ′ ] = [ w 00 w 01 b 0 w 10 w 11 b 1 ] [ x y 1 ] = M [ x y 1 ] (3) \\left[ \\beginmatrix x' \\\\ y' \\\\ \\endmatrix \\right] \\tag3= \\left[ \\beginmatrix w_00 & w_01 & b_0 \\\\ w_10 & w_11 & b_1\\\\ \\endmatrix \\right] \\left[ \\beginmatrix x \\\\ y \\\\ 1 \\endmatrix \\right]= M \\left[ \\beginmatrix x\\\\ y\\\\ 1 \\endmatrix \\right] [xy]=[w00w10w01w11b0b1]xy1=Mxy1(3)
通过参数矩阵 M M M就可以实现两个向量空间之间的转换,在进行仿射变换的时候我们也只需要一个矩阵 M M M就可以实现平移缩放旋转翻转变换。

接下来,会先介绍原理然后利用OpenCV来实现相应的例子,这里主要利用OpenCV的warpAffine函数来实现仿射变换

warpAffine函数参数:

  • src:输入的图像数组
  • M:仿射变换矩阵
  • dsize:变换后图像的大小
  • flags:使用的插值算法
  • borderValue:边界的填充值
图像平移

在平面坐标系有点 P ( x , y ) P(x,y) P(x,y)和点 P ′ ( x ′ , y ′ ) P'(x',y') P(x,y),如果我们想要将 P P P点移动到 P ′ P' P通过下面的变换就可以实现
x ′ = x + Δ x y ′ = y + Δ y x'=x+\\Delta x \\\\ y' = y + \\Delta y x=x+Δxy=y+Δy
其中 Δ x \\Delta x Δx Δ y \\Delta y Δy就是x方向上和y方向上的偏移量,我们将其转换为矩阵的形式
[ x ′ y ′ ] = [ 1 0 Δ x 0 1 Δ y ] [ x y 1 ] = M [ x y 1 ] \\left[ \\beginmatrix x'\\\\ y'\\\\ \\endmatrix \\right]= \\left[ \\beginmatrix 1 & 0 & \\Delta x\\\\ 0 & 1 & \\Delta y\\\\ \\endmatrix \\right] \\left[ \\beginmatrix x\\\\ y\\\\ 1 \\endmatrix \\right]= M\\left[ \\beginmatrix x\\\\ y\\\\ 1 \\endmatrix \\right] [xy]=[1001ΔxΔy]xy1=Mxy1
上面的矩阵 M M M就是仿射变换的平移参数,接下来我们利用OpenCV中的warpAffine函数来实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

def show_compare_img(original_img,transform_img):
    _,axes = plt.subplots(1,2)
    #显示图像
    axes[0].imshow(original_img)
    axes[1].imshow(transform_img)
    #设置子标题
    axes[0].set_title("original image")
    axes[1].set_title("warpAffine transform image")
    plt.show()


def translation_img():
    # 定义一个图像平移矩阵
    # x向左平移(负数向左,正数向右)20个像素
    # y向下平移(负数向上,正数向下)50个像素
    M = np.array([[1, 0, -20], [0, 1, 50]], dtype=np.float)
    # 读取需要平移的图像
    img = cv2.imread("test.jpg")
    # 将图片由BGR转为RGB
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    # 定义平移后图像的大小,保持和原图大小一致
    dsize = img.shape[:2][::-1]
    # 便于大家观察这里采用白色来填充边界
    translation_img = cv2.warpAffine(img, M, dsize, borderValue=(255, 255, 255))
    # 显示图像
    show_compare_img(img, translation_img)

translation_img()

图像翻转

有时候我们我们需要对图像进行水平翻转垂直翻转镜像翻转(同时进行水平和垂直翻转),想要实现这个功能并不难,我们可以通过opencv内置的flip方法很容易实现,还可以通过numpy的索引来实现,这里我们主要介绍通过仿射变换矩阵来实现这个功能

上图中的 A 、 B 、 C 、 D A、B、C、D ABCD表示图像的四个顶点,如果我们需要对图像进行水平翻转,那么我们就需要将 A A A点和 B B B点进行交换, C

图像的仿射变换:cv2.warpaffine()(代码片段)

...像的几何变换主要包括:平移、旋转、缩放、剪切、仿射、透视等。图像的几何变换主要分为:刚性变换、相似变换、仿射变换和透视变换(投影变换)刚性变换:平移+旋转相似变换:缩放+剪切仿... 查看详情

数学篇09#如何用仿射变换对几何图形进行坐标变换?(代码片段)

说明【跟月影学可视化】学习笔记。什么是仿射变换?仿射变换简单来说就是线性变换+平移。仿射变换具有2个性质;变换前是直线段的,变换后依然是直线段对两条直线段a和b应用同样的仿射变换,变换前后线段长... 查看详情

opencv完整例程24.图像的仿射变换(代码片段)

【OpenCV完整例程】24.图像的仿射变换几何变换的可以分为等距变换、相似变换、仿射变换和投影变换。在很多书籍中把等距变换、相似变换都称为仿射变换,常见的仿射变换包括平移、旋转、缩放、翻转、斜切等方法。等距... 查看详情

opencv——重映射仿射变换(代码片段)

1#include<opencv2/opencv.hpp>2#include<iostream>3#include<math.h>45usingnamespacecv;6usingnamespacestd;789intmain(intargc,char**argv)1011Matsrc,dst;12Matmap_x,map_y;13src=imread("3i 查看详情

生成组合仿射变换矩阵,裁剪+缩放+平移+斜切+旋转(代码片段)

...些新的内容发到再公号上。一般对图像做augmentation都会用仿射变换去实现,如果是用OpenCV来实现就是生成一个放射变换矩阵再调用OpenCV的warpAffine函数,传入变换矩阵和图片得到变换后的输出,这里的难点在于如何生... 查看详情

图像透视变换原理与实现(代码片段)

仿射变换和透视变换仿射变换是把一个二维坐标系转换到另一个二维坐标系的过程,转换过程坐标点的相对位置和属性不发生变换,是一个线性变换,该过程只发生旋转和平移过程。因此,一个平行四边形经过仿射变换后还是一... 查看详情

一文搞懂web端登录过程(代码片段)

一文搞懂web端登录过程无状态HTTP协议session和cookiecookie(存放在客户的浏览器上)session(存放在服务器端)session和cookie的区别token登录过程token验证在了解登陆过程的原理前,应该先弄清楚几个概念无状态HTTP... 查看详情

http/https一文搞懂(代码片段)

HTTP协议(HyperTextTransferProtocol,超文本传输协议):是一种发布和接收HTML页面的方法。HTTPS(HypertextTransferProtocoloverSecureSocketLayer)简单讲是HTTP的安全版,在HTTP下加入SSL层。SSL(S 查看详情

http/https一文搞懂(代码片段)

HTTP协议(HyperTextTransferProtocol,超文本传输协议):是一种发布和接收HTML页面的方法。HTTPS(HypertextTransferProtocoloverSecureSocketLayer)简单讲是HTTP的安全版,在HTTP下加入SSL层。SSL(S 查看详情

一文搞懂tf.function(代码片段)

朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow在tensorflow1.x的时候,代码默认的执行方式是graphexecution(图执行),而从tensorflow2.0开始,改为了eagerexecution(饥饿执行) 查看详情

opencvchapter3.图像的仿射变换(代码片段)

最近想对OpenCV进行系统学习,看到网上这份教程写得不错,于是跟着来学习实践一下。【youcans@qq.com,youcans的OpenCV例程,https://youcans.blog.csdn.net/article/details/125112487】程序仓库:https://github.com/zstar1003/OpenCV-Lea 查看详情

一文彻底搞懂前端沙箱(代码片段)

什么是“沙箱”沙箱(Sandbox)[1]也称作:“沙箱/沙盒/沙盘”。沙箱是一种安全机制,为运行中的程序提供隔离环境。通常是作为一些来源不可信、具破坏力或无法判定程序意图的程序提供实验之用。沙箱能够安全的执行不受信... 查看详情

一文彻底搞懂zookeeper(代码片段)

本文是基于CentOS7.9系统环境,进行Zookeeper的学习和使用1.Zookeeper简介1.1什么是ZookeeperZookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。本质上,就是文件系统+通知机制1.2Zookeeper工作机制Zookeepe... 查看详情

一文彻底搞懂zookeeper(代码片段)

本文是基于CentOS7.9系统环境,进行Zookeeper的学习和使用1.Zookeeper简介1.1什么是ZookeeperZookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。本质上,就是文件系统+通知机制1.2Zookeeper工作机制Zookeepe... 查看详情

一文彻底搞懂slam技术(代码片段)

什么是SLAM?SLAM (simultaneouslocalizationandmapping),也称为CML(ConcurrentMappingandLocalization),即时定位与地图构建,或并发建图与定位。问题可以描述为:将一个机器人放入未知环境中的未知位置,是否有办法让机器人一边逐步描... 查看详情

一文彻底搞懂slam技术(代码片段)

什么是SLAM?SLAM (simultaneouslocalizationandmapping),也称为CML(ConcurrentMappingandLocalization),即时定位与地图构建,或并发建图与定位。问题可以描述为:将一个机器人放入未知环境中的未知位置,是否有办法让机器人一边逐步描... 查看详情

一文搞懂rpc原理(代码片段)

RPC原理解析什么是RPCRPC(RemoteProcedureCallProtocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP/IP或UDP,为通信程序之间携带信... 查看详情

利用opencv的仿射变换函数warpaffine()实现图像的亚像素级平移(代码片段)

利用OpenCV的仿射变换函数warpAffine()实现图像的亚像素级平移通常的图像平移,移动的都是整数个单位,比如向右移动8个像素。亚像素级平移,则图像的平移量可以为带小数的量,比如向右移动8.5个像素。利用OpenCV... 查看详情