【CV学习笔记】图像预处理warpaffine

这篇具有很好参考价值的文章主要介绍了【CV学习笔记】图像预处理warpaffine。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、前言

在学习图像预处理的时候发现,之前用的图像预处理方法一般为 resize和letter box,这两种方法比较低效,后来在手写AI中接触到了warpaffine,只需要一步就能够对图像进行预处理,同时还能很方便的进行cuda加速,于是便记录下来。

欢迎正在学习或者想学的CV的同学进群一起讨论与学习,v:Rex1586662742,q群:468713665

2、学习内容

2.1、旋转变换

在图像处理过程中,图像主要有平移、缩放、旋转、放射、透视等变换,所有矩阵皆可用矩阵进行表示。首先通过下图来推导变换矩阵。

【CV学习笔记】图像预处理warpaffine

其中opencv中图像原点在左上方,点 p 绕原点O旋转角度 β \beta βp’ ,同时顺时针旋转变换之后的的角度为

$ \alpha - \beta$ ,同时由图中的三角函数关系可以得到如下公式:

x ′ = c o s ( α − β ) × m x' = cos(\alpha-\beta)×m x′=cos(α−β)×m

y ′ = s i n ( α − β ) × m y' = sin(\alpha-\beta)×m y′=sin(α−β)×m

m = x / cos ⁡ α = y / s i n β m = x/\cos\alpha = y/sin\beta m=x/cosα=y/sinβ

$cos(\alpha-\beta) = cos\alpha cos\beta + sin\alpha sin\beta $

s i n ( α − β ) = s i n α c o s β − c o s α s i n β sin(\alpha-\beta) = sin\alpha cos\beta - cos\alpha sin\beta sin(α−β)=sinαcosβ−cosαsinβ

化简以后得到:

【CV学习笔记】图像预处理warpaffine

2.2、缩放变换

缩放变换实际上就是在x,y的基础上乘以一个倍数scale

【CV学习笔记】图像预处理warpaffine

2.3、平移变换

平移变换实际上就是在x,y的基础上减去一个偏移量dx,dy

【CV学习笔记】图像预处理warpaffine

2.4、齐次坐标

为了便于矩阵计算,利用齐次坐标来表示点的变换,其中平移变换矩阵可表示为:

【CV学习笔记】图像预处理warpaffine

2.5、缩放+旋转+平移变换

三种变换可以写在一个矩阵当中,可以一次计算到位

【CV学习笔记】图像预处理warpaffine

对于图像的预处理,通常需要对图片进行不失真的缩放,用变换矩阵可表示为

【CV学习笔记】图像预处理warpaffine

先通过缩放,再移动到目标图的中间位置如果图像的H>W,则需要进行如下缩放

【CV学习笔记】图像预处理warpaffine

反之

【CV学习笔记】图像预处理warpaffine

以其中的一张图片为例,先将原图等比缩放到与目标图宽度一致

【CV学习笔记】图像预处理warpaffine

现在定义目标图的左上角在opencv坐标系的原点,现在需要原图移动到目标位置可以分为两个步骤,将原图的中心点移动到坐标系原点,对应于公式中的 -scale×Ow/2,-scale×Oh/2

【CV学习笔记】图像预处理warpaffine

再将图片移动到目标图的中心位置,对应于公式中的 + Dw/2, + Dh/2.

【CV学习笔记】图像预处理warpaffine

其过程可表示为 p ′ = M p p' =Mp p=Mp

2.6、逆变换

当图片进行仿射变换后需要恢复到原图或者模型推理得到结果之后需要恢复到原图尺寸时,可以利用逆变换能很方便的得到。

旋转矩阵R是正交的,得到R-1 = RT 于是求逆变换只需要对变换矩阵求逆即可,当然可以通过计算的方法得到

k = s c a l e k = scale k=scale

b 1 = − s c a l e × O w / 2 + D w / 2 b1 = -scale×Ow/2 + Dw/2 b1=scale×Ow/2+Dw/2

b 2 = − s c a l e × O h / 2 + D h / 2 b2 = -scale×Oh/2 + Dh/2 b2=scale×Oh/2+Dh/2

x ′ = k x + b 1 x' = kx + b1 x=kx+b1

y ′ = k y + b 2 y'= ky + b2 y=ky+b2

x = ( x ′ − b 1 ) / k = x ′ / k + ( − b 1 ) / k x = (x'-b1)/k = x'/k + (-b1)/k x=(xb1)/k=x/k+(b1)/k

y = ( y ′ − b 2 ) / k = y ′ / k + ( − b 2 ) / k y = (y'-b2)/k = y'/k + (-b2)/k y=(yb2)/k=y/k+(b2)/k

由此可以的到逆变换矩阵M-1

【CV学习笔记】图像预处理warpaffine

3、效果测试

import cv2
import matplotlib.pyplot as plt

def inv_mat(M):
    k = M[0,0],
    b1 = M[0,2]
    b2 = M[1,2],
    return np.array([[1/k,0,-b1/k],
                    [0,1/k,-b2/k]])

def transform(image,dst_size):
    oh,ow = image.shape[:2]
    dh,dw = dst_size
    scale = min(dw/ow,dh/oh)
    
    M = np.array([
        [scale,0,-scale * ow * 0.5 + dw * 0.5],
        [0,scale,-scale * oh * 0.5 + dh * 0.5]
    ])
    return cv2.warpAffine(image,M,dst_size),M,inv_mat(M)

img = cv2.imread("/home/rex/Desktop/rex_extra/notebook/warpaffine/keji2.jpeg")
img_d,M,inv= transform(img,(640,640))
plt.subplot(1,2,1)
plt.title("WarpAffine")
plt.imshow(img_d[...,::-1])

img_s = cv2.warpAffine(img_d,inv,img.shape[:2][::-1])
plt.subplot(1,2,2)
plt.title("or")
plt.imshow(img_s[...,::-1])

【CV学习笔记】图像预处理warpaffine文章来源地址https://www.toymoban.com/news/detail-403271.html

4、总结

本次学习内容介绍了高效的图像预处理方式,接下来将会对warpaffine进行cuda加速,进一步提高预处理的速度

到了这里,关于【CV学习笔记】图像预处理warpaffine的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【大厂AI课学习笔记】【2.2机器学习开发任务实例】(3)数据准备和数据预处理

    项目开始,首先要进行数据准备和数据预处理。 数据准备的核心是找到这些数据,观察数据的问题。 数据预处理就是去掉脏数据。 缺失值的处理,格式转换等。 延伸学习: 在人工智能(AI)的众多工作流程中,数据准备与预处理占据着举足轻重的地位。这两个步骤不仅影响

    2024年02月19日
    浏览(31)
  • 图像预处理算法————灰度化处理

    图像预处理算法适合在FPGA上完成,原理简单且需要快速处理,通常有灰度化、中值、均值滤波等,以及颜色空间转换算法。 灰度图像是一种特殊的彩色图像(R=G=B的彩色图像) 只有一种颜色分量,单通道的0-255 方法:一般有分量法、最大值法、平均值法、加权平均法四种方

    2024年01月17日
    浏览(39)
  • 图像预处理方法

    两个基本的形态学操作是腐 和膨胀。他们 的变体构成了开运算 ,闭运算, 梯度等。 根据卷积核的大小前景的所有像素会腐 掉 变为 0 ,所以前景物体会变小整幅图像的白色区域会减少。 对于去除白噪声很有用 也可以用来断开两个 在一块的物体等。 函数原型: ⚫src: 输入原

    2023年04月11日
    浏览(30)
  • 图像预处理技术与算法

    图像预处理是计算机视觉和图像处理中非常关键的第一步,其目的是为了提高后续算法对原始图像的识别、分析和理解能力。以下是一些主要的图像预处理技术: 1.图像增强: 对比度调整:通过直方图均衡化(Histogram Equalization)等方法改善图像整体或局部的对比度。 伽玛校

    2024年02月20日
    浏览(38)
  • 【第十七届智能车】智能车图像处理(1)-图像预处理

    本博客使用的硬件是逐飞总钻风130°无畸变摄像头,采用的图像分辨率为188*120,主控为CH32V307VCT6,使用DVI接口进行连接。 我们在本次比赛中采用的是头尾车总钻风摄像头+中间车线性CCD的方案。这两个感光部件各有优劣,使用方式和图像处理也大相径庭。这里讨论的是总钻风

    2024年02月08日
    浏览(39)
  • 使用 SKimage 的图像预处理

    介绍 图像是视觉对象的二维表示,例如照片、绘画或素描。在数字成像中,图像存储为像素值数组,其中每个像素代表图像亮度和颜色的样本。每个像素的颜色可以由一个或多个通道表示,如传统彩色图像中的红色、绿色和蓝色 (RGB) 通道。在本文中,你将学习各种图像预处

    2024年02月03日
    浏览(39)
  • matlab数据的获取、预处理、统计、可视化、降维 | 《matlab数学建模方法与实践(第三版)》学习笔记

    一、数据的获取 1.1 从Excel中获取 使用readtable() 使用xlsread()——xlswrite() 1.2  从TXT中获取 使用load() 使用textread() 使用fopen() fread() fclose()  使用fprintf()写入信息到txt  1.3 从图片中获取 使用imread  1.4 从视频获取  使用视觉工具箱中的VideoFileReader  二、数据的预处理 2.1 缺失值处

    2024年01月19日
    浏览(57)
  • 【机器学习算法】KNN鸢尾花种类预测案例和特征预处理。全md文档笔记(已分享,附代码)

    本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用,结合场景解决实际问题。包括K-近邻算法,线性回归,逻

    2024年02月19日
    浏览(35)
  • 关于图像分割的预处理 transform

    目录 1. 介绍 2. 关于分割中的 resize 问题 3. 分割的 transform 3.1 随机缩放 RandomResize 3.2 随机水平翻转 RandomHorizontalFlip 3.3 随机竖直翻转 RandomVerticalFlip 3.4 随机裁剪 RandomCrop 3.5 ToTensor 3.6 normalization 3.7 Compose 3.8 中心裁剪 3.9 Resize 缩放 4. 预处理结果可视化 图像分割的预处理不像

    2024年02月04日
    浏览(37)
  • 图像预处理 Tricks【1】:Contours

    轮廓可以简单地理解为连接所有连续点(沿物体边界)的曲线,这些点通常具有相同的颜色或强度。 轮廓在图像分析中具有重要意义,是物体形状分析和对象检测和识别的有用工具,是理解图像语义信息的重要依据。 本文主要介绍了在 opencv 中,一些重要的用于处理物体轮廓

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包