仿射变换

STN-Spatial Transformer Networks-论文笔记

寵の児 提交于 2020-01-06 07:47:41
原文链接: https://arleyzhang.github.io/articles/7c7952f0/ 论文地址: https://arxiv.org/abs/1506.02025 1 简介 1.2 问题提出 CNN在图像分类中取得了显著的成效,主要是得益于 CNN 的深层结构具有 空间不变性(spatially invariance)(平移不变性,旋转不变性),所以图像上的目标物体就算是做了平移或者旋转,CNN仍然能够准确的识别出来,这对于CNN的泛化能力是有益的。 空间不变性主要是由于 Pooling 层 和 步长不为1的卷积层 的存在带来的。实际上主要是池化层的作用,因为大部分的卷积层的步长都是大于1而又小于卷积核大小的,也就是滑动时是有重叠的,而池化层一般不是重叠的。也就是说这些层越多,越深,池化核或卷积核越大,空间不变性也越强;但是随之而来的问题是局部信息丢失,所以这些层越多准确率肯定是下降的,所以主流的CNN分类网络一般都很深,但是池化核都比较小,比如2×2。 比如ResNet,GoogLeNet,VGG,FCN,这些网络的总降采样比例一般是 16或32,基本没有见过 64倍,128倍或者更高倍数的降采样(会损失局部信息降低准确率),也很少见到 2倍或者4倍的降采样比例(空间不变性太弱,泛化能力不好)。不过这个是跟数据集中的图像大小有关的

图像特征提取

人走茶凉 提交于 2019-12-29 21:33:50
What is a Feature Descriptor A feature descriptor is a representation of an image or an image patch that simplifies the image by extracting useful information and throwing away extraneous information. This all sounds good, but what is “useful” and what is “extraneous” ? To define “useful”, we need to know what is it “useful” for ? Clearly, the feature vector is not useful for the purpose of viewing the image. But, it is very useful for tasks like image recognition and object detection. The feature vector produced by these algorithms when fed into an image classification algorithms like Support

[opencv] 图像几何变换:旋转,缩放,斜切

不问归期 提交于 2019-12-26 15:13:36
几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动。 几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定为整数坐标。这时就需要灰度级差值将映射的新坐标匹配到输出像素之间。最简单的插值方法是最近邻插值,就是令输出像素的灰度值等于映射最近的位置像素,该方法可能会产生锯齿。这种方法也叫零阶插值,相应比较复杂的还有一阶和高阶插值。 插值算法感觉只要了解就可以了,图像处理中比较需要理解的还是空间变换。 空间变换 空间变换对应矩阵的 仿射变换 。一个坐标通过函数变换的新的坐标位置: 所以在程序中我们可以使用一个2*3的数组结构来存储变换矩阵: 以最简单的平移变换为例,平移(b1,b2)坐标可以表示为: 因此,平移变换的变换矩阵及逆矩阵记为: 缩放变换:将图像横坐标放大(或缩小)sx倍,纵坐标放大(或缩小)sy倍,变换矩阵及逆矩阵为: 选择变换:图像绕原点逆时针旋转a角,其变换矩阵及逆矩阵(顺时针选择)为: OpenCV中的图像变换函数 基本的放射变换函数: void cvWarpAffine( const CvArr* src,//输入图像 CvArr* dst, //输出图像 const CvMat* map_matrix, //2*3的变换矩阵 int flags=CV_INTER_LINEAR

仿射变换,根据点求变换矩阵以及根据角度和缩放因子求变换矩阵

落花浮王杯 提交于 2019-12-26 02:10:06
//仿射变换,根据点求变换矩阵以及根据角度和缩放因子求变换矩阵 Mat mapx ; Mat mapy ; Mat src ; Mat dst ; int main ( ) { //1.原图像。 src = imread ( "马车2.jpg" ) ; resize ( src , src , Size ( ) , 0.1 , 0.1 ) ; imshow ( "效果图" , src ) ; //2.确定两组点,每组点3个。 Point2f src_triangle [ 3 ] ; src_triangle [ 0 ] = Point2f ( 0. , 0. ) ; src_triangle [ 1 ] = Point2f ( 0. , static_cast < float > ( src . rows - 1 ) ) ; src_triangle [ 2 ] = Point2f ( static_cast < float > ( src . cols - 1 ) , 0. ) ; Point2f dst_triangle [ 3 ] ; dst_triangle [ 0 ] = Point2f ( 0.12 * src . cols , 0.43 * src . rows ) ; dst_triangle [ 1 ] = Point2f ( 0.33 * src . cols

变换与卷绕

旧城冷巷雨未停 提交于 2019-12-16 08:52:29
线性变换(全局卷绕的一种) 哪些变换可以用2x2矩阵表示? 注意:平移不是2D坐标上的线性运算 仿射变换 仿射变换的好处 透视(投影)变换 实现图像卷绕 前向卷绕(映射) 反向卷绕 参考资料: 如何通俗地讲解「仿射变换」这个概念? 机器学习基础–math(19)–2D平面变换 来源: CSDN 作者: xygenesis 链接: https://blog.csdn.net/qq_39132235/article/details/103507011

【迁移攻击笔记】梯度/Loss/Query都不用也可以攻击!Enhancing Cross-task 对抗Black-Box迁移 with Dispersion Reduction

让人想犯罪 __ 提交于 2019-12-11 02:54:48
亮点: ①不需要目标模型的任何访问信息就可以攻击。 ②攻击方法可以跨任务:同一张图,生成的攻击对象适用于各种CV检测。更加符合实际。 核心思想: CV大类的检测网络,往往都是捕捉特征进行判断。 因此文章近似把深度网络分成俩部分:特征捕捉+仿射变换 : ①特征捕捉是捕捉图片的底层特征,文中的思想是各个网络捕捉到的可能都差不多(捕捉到的特征为向量a)。 ②仿射变换(= W*a )为分类信息,各个网络差异很大。 其中 W 可以看成( w1,w2,…… )表示不同的分类参数。 之所以一个网络中把图像分类成n类,是因为在仿射变换 W*a 中, wn×a 最大,即 wn 和 a 重合度最高(这个结论和协方差Cov有关,虽然我也没太弄明白)。至此,误分类的思路就很简单了,改变特征 a 的特征向量的方向,就可以使 wn×a 变小,同时其他的 w1×a , w2×a 等就会随机增大,就可能产生误分类。 最后一个问题,怎么确定特征a? 随便选个网络,输入图像,随便取差不多中间一层,输出就是特征a。 再对 a 进行上述操作之后,就可以攻击目标网络了。 全程不需要目标网络的参与。 当然以上攻击过程存在一个重要先验(文中表述为‘经验推理’):所有的CV大类的网络,在底层特征 a 的捕捉上是基本一致的。 伪代码和核心说明部分如下: 效果: 希望路过这儿的你可以关注我一下~~我会定期更新一系列阅读笔记和总结

图像归一化

前提是你 提交于 2019-12-08 02:32:29
一、简介 图像归一化是计算机视觉、模式识别等领域广泛使用的一种技术。所谓图像归一化, 就是通过一系列变换, 将待处理的原始图像转换成相应的唯一标准形式(该标准形式图像对平移、旋转、缩放等仿射变换具有不变特性)。 近年来, 基于矩的图像归一化技术受到了人们的普遍关注, 其基本工作原理为: 首先利用图像中对仿射变换具有不变性的矩来确定变换函数的参数, 然后利用此参数确定的变换函数把原始图像变换为一个标准形式的图像(该图像与仿射变换无关)。 一般说来, 基于矩的图像归一化过程包括 4 个步骤 即坐标中心化、x-shearing 归一化、缩放归一化和旋转归一化。 基本上归一化思想是利用图像的不变矩寻找一组参数使其能够消除其他变换函数对图像变换的影响。也就是转换成唯一的标准形式以抵抗仿射变换。图像归一化使得图像可以抵抗几何变换的攻击,它能够找出图像中的那些不变量,从而得知这些图像原本就是一样的或者一个系列的。以下你要知道的: 1.归一化处理并没有改变图像的对比度 2.归一化处理很简单,假设原图像是8位灰度图像,那么读入的像素矩阵最大值为256,最小值为1,定义矩阵为I,J=I/256,就是归一化的图像矩阵,就是说归一化之后所有的像素值都在[0,1]区间内。 二、什么是归一化 归一化就是通过一系列变换(即利用图像的不变矩寻找一组参数使其能够消除其他变换函数对图像变换的影响)

cv2.warpAffine 参数详解

自古美人都是妖i 提交于 2019-12-04 20:42:36
本文链接:https://blog.csdn.net/qq878594585/article/details/81838260 本文为作者原创文章,未经同意严禁转载! opencv中的仿射变换在python中的应用并未发现有细致的讲解,函数cv2.warpAffine的参数也模糊不清,今天和大家分享一下参数的功能和具体效果,如下: 官方给出的参数为: cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst 其中: src - 输入图像。 M - 变换矩阵。 dsize - 输出图像的大小。 flags - 插值方法的组合(int 类型!) borderMode - 边界像素模式(int 类型!) borderValue - (重点!)边界填充值; 默认情况下,它为0。 上述参数中:M作为仿射变换矩阵,一般反映平移或旋转的关系,为InputArray类型的2×3的变换矩阵。 flages表示插值方式,默认为 flags=cv2.INTER_LINEAR,表示线性插值,此外还有:cv2.INTER_NEAREST(最近邻插值) cv2.INTER_AREA (区域插值) cv2.INTER_CUBIC(三次样条插值) cv2.INTER_LANCZOS4(Lanczos插值)

仿射变换及其变换矩阵的理解

回眸只為那壹抹淺笑 提交于 2019-12-04 18:30:02
原文地址: https://www.cnblogs.com/shine-lee/p/10950963.html 写在前面 2D图像常见的坐标变换如下图所示: 这篇文章不包含 透视变换 (projective/perspective transformation),而将重点放在 仿射变换 (affine transformation),将介绍仿射变换所包含的各种变换,以及变换矩阵该如何理解记忆。 仿射变换:平移、旋转、放缩、剪切、反射 仿射变换包括如下所有变换,以及这些变换任意次序次数的组合 : 平移 (translation)和 旋转 (rotation)顾名思义,两者的组合称之为 欧式变换 (Euclidean transformation)或 刚体变换 (rigid transformation); 放缩 (scaling)可进一步分为 uniform scaling 和 non-uniform scaling ,前者每个坐标轴放缩系数相同(各向同性),后者不同;如果放缩系数为负,则会叠加上 反射 (reflection)——reflection可以看成是特殊的scaling; 刚体变换+uniform scaling 称之为, 相似变换 (similarity transformation),即平移+旋转+各向同性的放缩; 剪切变换 (shear mapping

【数字图像处理】仿射变换与透视变换

不羁岁月 提交于 2019-12-04 14:27:20
仿射变换与透视变换   仿射变换和透视变换更直观的叫法可以叫做「平面变换」和「空间变换」或者「二维坐标变换」和「三维坐标变换」。一个是二维坐标(x,y),一个是三维坐标(x,y,z)。也就是: 仿射变换: 透视变换:   从另一个角度也能说明三维变换和二维变换的意思,仿射变换的方程组有6个未知数,所以要求解就需要找到3组映射点,三个点刚好确定一个平面。透视变换的方程组有8个未知数,所以要求解就需要找到4组映射点,四个点就刚好确定了一个三维空间。   仿射变换和透视变换的数学原理也不需要深究,其计算方法为坐标向量和变换矩阵的乘积,换言之就是矩阵运算。在应用层面,放射变换是图像基于3个固定顶点的变换,如图1.1所示:   图中红点即为固定顶点,在变换先后固定顶点的像素值不变,图像整体则根据变换规则进行变换同理,透视变换是图像基于4个固定顶点的变换,如图1.2所示:   在OpenCV中,放射变换和透视变换均有封装好的函数,分别为: void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar()) 与 void