前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >tensorflow 层_win7怎么扩展屏幕

tensorflow 层_win7怎么扩展屏幕

作者头像
全栈程序员站长
发布于 2022-09-27 02:01:35
发布于 2022-09-27 02:01:35
60700
代码可运行
举报
运行总次数:0
代码可运行

前言

读TensorFlow相关代码看到了STN的应用,搜索以后发现可替代池化,增强网络对图像变换(旋转、缩放、偏移等)的抗干扰能力,简单说就是提高卷积神经网络的空间不变性。

国际惯例,参考博客:

理解Spatial Transformer Networks

github-STN

Deep Learning Paper Implementations: Spatial Transformer Networks – Part I

Deep Learning Paper Implementations: Spatial Transformer Networks – Part II 将STN加入网络训练的一个关于图像隐写术的案例:StegaStamp

理论

图像变换

因为图像的本质就是矩阵,那么图像变换就是矩阵变换,先复习一下与图像相关的矩阵变换。假设 M M M为变换矩阵, N N N为图像,为了简化表达,设 M M M的维度是 ( 2 , 2 ) (2,2) (2,2), N N N代表像素点坐标,则维度是 ( 2 , 1 ) (2,1) (2,1),以下操作均为对像素位置的调整操作,而非对像素值的操作。

  • 缩放 M × N = [ p 0 0 q ] × [ x y ] = [ p x q y ] M\times N=\begin{bmatrix} p&0\\ 0&q \end{bmatrix}\times \begin{bmatrix} x\\y \end{bmatrix}=\begin{bmatrix} px\\qy \end{bmatrix} M×N=[p0​0q​]×[xy​]=[pxqy​]
  • 旋转:绕原点顺时针旋转 θ \theta θ角 M × N = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] × [ x y ] = [ x cos ⁡ θ − y sin ⁡ θ x sin ⁡ θ + y cos ⁡ θ ] M\times N=\begin{bmatrix} \cos\theta&-\sin\theta\\ \sin\theta&\cos\theta \end{bmatrix}\times \begin{bmatrix} x\\y \end{bmatrix}=\begin{bmatrix} x\cos\theta-y\sin\theta\\x\sin\theta+y\cos\theta \end{bmatrix} M×N=[cosθsinθ​−sinθcosθ​]×[xy​]=[xcosθ−ysinθxsinθ+ycosθ​]
  • 错切(shear):类似于将字的正体变成斜体 M × N = [ 1 m n 1 ] × [ x y ] = [ x + m y y + n x ] M\times N=\begin{bmatrix} 1&m\\ n&1 \end{bmatrix}\times \begin{bmatrix} x\\y \end{bmatrix}=\begin{bmatrix} x+my\\y+nx \end{bmatrix} M×N=[1n​m1​]×[xy​]=[x+myy+nx​]
  • 平移:要转换为齐次矩阵做平移 M ′ × N ′ = [ 1 0 a 0 1 b ] × [ x y 1 ] = [ x + a y + b ] M'\times N'=\begin{bmatrix} 1&0&a\\ 0&1&b \end{bmatrix}\times \begin{bmatrix} x\\y\\1 \end{bmatrix}=\begin{bmatrix} x+a\\y+b \end{bmatrix} M′×N′=[10​01​ab​]×⎣⎡​xy1​⎦⎤​=[x+ay+b​]

盗用参考博客的图解就是:

注意,我们进行多次变换的时候有多个变换矩阵,如果每次计算一个变换会比较耗时,参考矩阵的乘法特性,我们可以先将变换矩阵相乘,得到一个完整的矩阵代表所有变换,最后乘以图像,就可将图像按照组合变换顺序得到变换图像。这个代表一系列的变换的矩阵通常表示为: M = [ a b c d e f ] M=\begin{bmatrix} a&b&c\\d&e&f \end{bmatrix} M=[ad​be​cf​] 因为直接计算位置的值,很可能得到小数,比如将 ( 3 , 3 ) (3,3) (3,3)的图像放大到 ( 9 , 9 ) (9,9) (9,9),也就是放大3倍,那么新图像 ( 8 , 8 ) (8,8) (8,8)位置的像素就是原图 ( 8 / 3 , 8 / 3 ) (8/3,8/3) (8/3,8/3)位置的像素,但是像素位置不可能是小数,因而出现了解决方案:双线性插值

双线性插值

先复习一下线性插值,直接去看之前写的这篇博客,知道 ( x 1 , y 1 ) (x_1,y_1) (x1​,y1​)与 ( x 2 , y 2 ) (x_2,y_2) (x2​,y2​),求 ( x 1 , x 2 ) 区 间 内 的 点 (x_1,x_2)区间内的点 (x1​,x2​)区间内的点 x x x位置的y值,结果是: y = x − x 2 x 1 − x 2 y 1 + x − x 1 x 2 − x 1 y 2 y=\frac{x-x_2}{x_1-x_2}y_1+\frac{x-x_1}{x_2-x_1}y_2 y=x1​−x2​x−x2​​y1​+x2​−x1​x−x1​​y2​ 可以发现线性插值是针对一维坐标的,即给 x x x求 y y y,但是双线性插值是针对二维坐标点的,即给 ( x , y ) (x,y) (x,y)求值 Q Q Q。方法是先在 x x x轴方向做两次线性插值,再在 y y y轴上做一次线性插值。

设需要求 ( x , y ) (x,y) (x,y)处的值,我们需要预先知道其附近四个坐标点及其对应的值,如:

  • ( x , y ) (x,y) (x,y)左下角坐标为 ( x 1 , y 1 ) (x_1,y_1) (x1​,y1​),值为 Q 1 Q_1 Q1​
  • ( x , y ) (x,y) (x,y)右下角坐标为 ( x 2 , y 1 ) (x_2,y_1) (x2​,y1​), 值为 Q 2 Q_2 Q2​
  • ( x , y ) (x,y) (x,y)左上角坐标为 ( x 1 , y 2 ) (x_1,y_2) (x1​,y2​), 值为 Q 3 Q_3 Q3​
  • ( x , y ) (x,y) (x,y)右上角坐标为 ( x 2 , y 2 ) (x_2,y_2) (x2​,y2​),值为 Q 4 Q_4 Q4​

首先对下面的 ( x 1 , y 1 ) (x_1,y_1) (x1​,y1​)和 ( x 2 , y 1 ) (x_2,y_1) (x2​,y1​)做线性插值,方法是把它两看做一维坐标 ( x 1 , Q 1 ) (x_1,Q_1) (x1​,Q1​)和 ( x 2 , Q 2 ) (x_2,Q2) (x2​,Q2),得到: P 1 = x − x 2 x 1 − x 2 Q 1 + x − x 1 x 2 − x 1 Q 2 P_1=\frac{x-x_2}{x_1-x_2}Q_1+\frac{x-x_1}{x_2-x_1}Q_2 P1​=x1​−x2​x−x2​​Q1​+x2​−x1​x−x1​​Q2​ 同理得到上面的两个坐标 ( x 1 , y 2 ) (x_1,y_2) (x1​,y2​)与 ( x 2 , y 2 ) (x_2,y_2) (x2​,y2​)的插值结果,也就是 ( x 1 , Q 3 ) (x_1,Q_3) (x1​,Q3​)和 ( x 2 , Q 4 ) (x_2,Q_4) (x2​,Q4​)的线性插值结果: P 2 = x − x 2 x 1 − x 2 Q 3 + x − x 1 x 2 − x 1 Q 4 P_2=\frac{x-x_2}{x_1-x_2}Q_3+\frac{x-x_1}{x_2-x_1}Q_4 P2​=x1​−x2​x−x2​​Q3​+x2​−x1​x−x1​​Q4​ 再对 ( y 1 , P 1 ) (y_1,P_1) (y1​,P1​)和 ( y 2 , P 2 ) (y_2,P_2) (y2​,P2​)做线性插值: P = x − y 2 y 1 − y 2 P 1 + y − y 1 y 2 − y 1 P 2 P=\frac{x-y_2}{y_1-y_2}P_1+\frac{y-y_1}{y_2-y_1}P_2 P=y1​−y2​x−y2​​P1​+y2​−y1​y−y1​​P2​ 解决上面图像变换的问题,假设变换后的坐标不是整数,那么就选择这个坐标四个角的坐标的双线性插值的结果,比如 ( 8 / 3 , 8 / 3 ) (8/3,8/3) (8/3,8/3)位置的像素就是 ( 2 , 2 ) , ( 3 , 2 ) , ( 2 , 3 ) , ( 3 , 3 ) (2,2),(3,2),(2,3),(3,3) (2,2),(3,2),(2,3),(3,3)位置像素的双线性插值结果。

总之就是先计算目标图像像素在源图像中的位置,然后得到源图像位置是小数,针对小数位置的四个顶点做双线性插值。

上面就是STN做的工作,也可以发现STN接受的参数就是6个,接下来看看为什么STN能提高卷积网络的旋转、平移、缩放不变性。

总结一下:

图像处理中的仿射变换通常包含三个步骤:

  • 创建由 ( x , y ) (x,y) (x,y)组成的采样网格,比如 ( 400 , 400 ) (400,400) (400,400)的灰度图对应创建一个同样大小的网格。
  • 将变换矩阵应用到采样网格上
  • 使用插值技术从原图中计算变换图的像素值

池化

强行翻译一波这篇文章关于池化的部分,建议看原文,这里摘取个人认为重要部分:

池化在某种程度上增加了模型的空间不变性,因为池化是一种下采样技术,减少了每层特征图的空间大小,极大减少了参数数量,提高了运算速度。

池化提供的不变性确切来说是什么?池化的思路是将一个图像切分成多个单元,这些复杂单元被池化以后得到了可以描述输出的简单的单元。比如有3张不同方向的数字7的图像,池化是通过图像上的小网格来检测7,不受7的位置影响,因为通过聚集的像素值,我们得到的信息大致一样。个人觉得,作者的本意是单看小网格,是有很多一样的块。

池化的缺点在于:

  • 丢失了75%的信息(应该是 ( 2 , 2 ) (2,2) (2,2)的最大值池化方法),意味着我们一定丢了是精确的位置信息。有人会问,这样可以增加空间鲁棒性哇。然而,对于视觉识别人物,空间信息是非常重要的。比如分类猫的时候,知道猫的胡须的位置相对于鼻子的位置有可能很重要,但是如果使用最大池化,可能丢失了这个信息。
  • 池化是局部的且预定义好的。一个小的接受域,池化操作的影响仅仅是针对更深的网络层(越深感受野越大),也就是中间的特征图可能受到严重的输入失真的影响。我们不能任意增加接受域,这样会过度下采样。

主要结论就是卷积网络对于相对大的输入失真不具有不变性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
The pooling operation used in convolutional neural networks is a big mistake and the fact that it works so well is a disaster. (Geoffrey Hinton, Reddit AMA)

STN理论

STN的全称是Spatial Transformer Networks,空间变换网络。时空变换机制就是通过给CNN提供显式的空间变换能力,以解决上述池化出现的问题。有三种特性:

  • Modular:STN能够被插入到网络的任意地方,仅需很小的调整
  • differentiable:STN可以通过反向传播训练
  • dynamic:STN是对每个输入样本的一个特征图做空间变换,而池化是针对所有样本。

上图是STN网络的主要框架。所以到底什么是空间变换?通过结构图可发现模型包含三部分:localisation networkgrid generatorsampler

Localisation Network

主要是提取被应用到输入特征图上的仿射变换的参数 θ \theta θ,网络结构是:

  • 输入:大小为 ( H , W , C ) (H,W,C) (H,W,C)的特征图 U U U
  • 输出:大小为 ( 6 , 1 ) (6,1) (6,1)的变换矩阵 θ \theta θ
  • 结构:全连接或者卷积

Parametrised Sampling Grid

输出参数化的采样网格,是一系列的点,每个输入特征图能够产生期望的变换输出。

具体就是:网格生成器首先产生于输入图像 U U U大小相同的标准网格,然后将仿射变换应用到网格。公式表达即,假设输入图的索引是 ( x t , y t ) (x^t,y^t) (xt,yt),将 θ \theta θ代表的变换应用到坐标上得到新的坐标: [ x s y s ] = [ θ 1 θ 2 θ 3 θ 4 θ 5 θ 6 ] × [ x t y t 1 ] \begin{bmatrix} x^s\\y^s \end{bmatrix}=\begin{bmatrix} \theta_1&\theta_2&\theta_3\\\theta_4&\theta_5&\theta_6 \end{bmatrix}\times\begin{bmatrix} x^t\\y^t\\1 \end{bmatrix} [xsys​]=[θ1​θ4​​θ2​θ5​​θ3​θ6​​]×⎣⎡​xtyt1​⎦⎤​ Differentiable Image Sampling

依据输入特征图和参数化采样网格,我们可以利用双线性插值方法获得输出特征图。注意,这一步我们可以通过制定采样网格的大小执行上采样或者下采样,很像池化。

左图使用了单位变换,右图使用了旋转的仿射变换。

【注】因为双线性插值是可微的,所以STN可以作为训练网络的一部分。

代码

利用STN前向过程做图像变换

GitHub上有作者提供了源码,也可以用pip直接安装。

代码直接贴了,稍微改了一点点:

导入包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf
import cv2
import numpy as np

from stn import spatial_transformer_network as transformer

读入图像,转换为四维矩阵:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
img=cv2.imread('test_img.jpg')
img=np.array(img)
H,W,C=img.shape
img=img[np.newaxis,:]
print(img.shape)

旋转变换的角度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
degree=np.deg2rad(45)
theta=np.array([
    [np.cos(degree),-np.sin(degree),0],
    [np.sin(degree),np.cos(degree),0]
])

构建网络结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x=tf.placeholder(tf.float32,shape=[None,H,W,C])
with tf.variable_scope('spatial_transformer'):
    theta=theta.astype('float32')
    theta=theta.flatten()
    
    loc_in=H*W*C #输入维度
    loc_out=6 #输出维度
    W_loc=tf.Variable(tf.zeros([loc_in,loc_out]),name='W_loc')
    b_loc=tf.Variable(initial_value=theta,name='b_loc')
    
    #运算
    fc_loc=tf.matmul(tf.zeros([1,loc_in]),W_loc)+b_loc
    h_trans=transformer(x,fc_loc)

把图像喂进去,并显示图像

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
init=tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    y=sess.run(h_trans,feed_dict={ 
   x:img})
    print(y.shape)
    
y=np.squeeze(np.array(y,dtype=np.uint8))
print(y.shape)
cv2.imshow('trasformedimg',y)
cv2.waitKey()
cv2.destroyAllWindows()

重点关注网络构建

权重w_loc是全零的大小为 ( H W C , 6 ) (HWC,6) (HWC,6)的矩阵,偏置b_loc是大小为 ( 1 , 6 ) (1,6) (1,6)的向量,这样经过运算

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fc_loc=tf.matmul(tf.zeros([1,loc_in]),W_loc)+b_loc

得到的其实就是我们指定的旋转角度对应的6维变换参数,最后利用变换函数transformer执行此变换就行了。

将STN加入网络中训练

主要参考StegaStamp作者的写法,这里做STN部分加入网络的方法: 输入一张图片到如下网络结构(Keras网络结构搭建语法):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stn_params = Sequential([
            Conv2D(32, (3, 3), strides=2, activation='relu', padding='same'),
            Conv2D(64, (3, 3), strides=2, activation='relu', padding='same'),
            Conv2D(128, (3, 3), strides=2, activation='relu', padding='same'),
            Flatten(),
            Dense(128, activation='relu')
        ])

得到 ( 1 , 128 ) (1,128) (1,128)维的向量,其实用一个网络替换上面前向计算中的loc_in,目的是为了得到二维图像对应的一维信息 后面的过程就和前向计算一样了,定义权重和偏置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
W_fc1 = tf.Variable(tf.zeros([128, 6]), name='W_fc1')
b_fc1 = tf.Variable(initial_value=initial, name='b_fc1')

然后利用一维信息得到图像变换所需的6个值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x = tf.matmul(stn_params, self.W_fc1) + self.b_fc1

最后利用STN库将变换应用到图像中,得到下一层网络结构的输入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
transformed_image = stn_transformer(image, x, [self.height, self.width, 3])

可以看出,STN加入到网络后,训练参数有:

  • 二维图像到一维特征向量的卷积+全连接网络的权重和偏置
  • 一维向量到6维变换参数的权重和偏置

总结

通篇就是对池化方案的改变,使用STN能够增加网络的变换不变性,比池化的效果更好。

代码:

链接:https://pan.baidu.com/s/1kDs9T-Mf1F_mzQyvslcROA 提取码:crdu

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/180606.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
详细解读Spatial Transformer Networks(STN)-一篇文章让你完全理解STN了
普通的CNN能够显示的学习平移不变性,以及隐式的学习旋转不变性,但attention model 告诉我们,与其让网络隐式的学习到某种能力,不如为网络设计一个显式的处理模块,专门处理以上的各种变换。因此,DeepMind就设计了Spatial Transformer Layer,简称STL来完成这样的功能。
全栈程序员站长
2022/11/02
4.2K0
详细解读Spatial Transformer Networks(STN)-一篇文章让你完全理解STN了
另一种(Yet Another)三角形线性插值方法
给定一个三角形的顶点坐标(P0, P1 和 P2)以及对应的数值(V0, V1 和 V2),插值求解三角形内一点(坐标给定为P)的数值(V).
用户2615200
2019/04/25
1.2K0
另一种(Yet Another)三角形线性插值方法
Spatial Transformer Networks(STN)详解
  普通的CNN能够显示的学习平移不变性,以及隐式的学习旋转不变性,但attention model 告诉我们,与其让网络隐式的学习到某种能力,不如为网络设计一个显式的处理模块,专门处理以上的各种变换。因此,DeepMind就设计了Spatial Transformer Layer,简称STL来完成这样的功能。
全栈程序员站长
2022/11/07
2.2K0
Spatial Transformer Networks(STN)详解
Spatial Transformer Networks(STN)理解
之前参加过一个点云数据分类的比赛,主要借鉴了PointNet的网络结构,在PointNet中使用到了两次STN。点云数据存在两个主要问题:1、无序性:点云本质上是一长串点(nx3矩阵,其中n是点数)。在几何上,点的顺序不影响它在空间中对整体形状的表示,例如,相同的点云可以由两个完全不同的矩阵表示。2、旋转性:相同的点云在空间中经过一定的刚性变化(旋转或平移),坐标发生变化,我们希望不论点云在怎样的坐标系下呈现,网络都能正确的识别出。
全栈程序员站长
2022/11/02
1.2K0
Spatial Transformer Networks(STN)理解
理解齐次坐标的意义
在介绍为什么要引入齐次坐标之前先介绍这三个操作的线性代数的表达形式。为了说明方便以二维进行举例说明。
marsggbo
2019/11/29
1.2K0
理解齐次坐标的意义
线性代数01 线性的大脑
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载。
Vamei
2018/09/25
5750
线性代数01 线性的大脑
双线性插值 一文全讲解
大家好,又见面了,我是你们的朋友全栈君。 1、原理 在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值,兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较广泛。   越是简单的模型越适合用来举例子,我们就举个简单的图像:33 的256级灰度图。假如图像的象素矩阵如下图所示(这个原始图把它叫做源图,Source): 234 38 22 67 44 12 89 65 63   这 个矩阵中,元素坐标
全栈程序员站长
2022/08/22
1.8K0
双线性插值 一文全讲解
10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换 OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)数字图像
  图像几何变换又称为图像空间变换,它将一副图像中的坐标位置映射到另一幅图像中的新坐标位置。我们学习几何变换就是确定这种空间映射关系,以及映射过程中的变化参数。图像的几何变换改变了像素的空间位置,建立一种原图像像素与变换后图像像素之间的映射关系,通过这种映射关系能够实现下面两种计算:
vv彭
2020/10/27
4K0
10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换
    


OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)数字图像
隐马尔科夫模型(HMM)笔记(公式+代码)
隐马尔科夫模型(hidden Markov model,HMM)是可用于标注问题的统计学习模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型。隐马尔可夫模型在语音识别、自然语言处理、生物信息、模式识别等领域有着广泛的应用。
Michael阿明
2020/07/13
5.6K0
隐马尔科夫模型(HMM)笔记(公式+代码)
SFM原理简介「建议收藏」
小孔模型成的是倒像,为了表述与研究的方便,我们常常将像面至于小孔之前,且到小孔的距离仍然是焦距f,这样的模型与原来的小孔模型是等价的,只不过成的是正像,符合人的直观感受。 在这种情况下,往往将小孔称作光心(Optical Center)。
全栈程序员站长
2022/06/24
2.4K0
SFM原理简介「建议收藏」
从零开始一起学习SLAM | 用四元数插值来对齐IMU和图像帧
小白:师兄,好久没见到你了啊,我最近在看IMU(Inertial Measurement Unit,惯性导航单元)相关的东西,正好有问题求助啊
用户1150922
2019/08/29
1.3K0
从零开始一起学习SLAM | 用四元数插值来对齐IMU和图像帧
论文笔记之STN_论文笔记软件
这篇文章是15年谷歌DeepMind团队推出的一个可以学习一种变换,这种变换可以将进行了仿射变换的目标进行校正的网络——Spatial Transformer Network(STN)。STN具有空间不变性特点,也就是说STN可以使图片经过各种变换后的识别效果和未变换前的识别效果保持不变。
全栈程序员站长
2022/11/02
9350
论文笔记之STN_论文笔记软件
目标检测(Object Detection)-Faster RCNN中的ROI Pooling Layer
ROI(Region Of Interest)是从目标图像中识别出的候选识别区域。在Faster RCNN中,候选识别区域(ROIs)是把从RPN(Region Proposal Network)产生的候选识别框映射到Feature Map上得到的。 ROI Pooling的作用就是把大小形状各不相同的候选识别区域归一化为固定尺寸的目标识别区域。
YoungTimes
2022/04/28
1.5K0
目标检测(Object Detection)-Faster RCNN中的ROI Pooling Layer
图像旋转:getRotationMatrix2D详解--无损失旋转图片
使用opencv对图像进行旋转的代码随手一搜即得,但是有些旋转后图像会不完整,有些只给出代码并未解释其实现原理。本文会详细介绍如何使用opencv实现图像旋转得到完整图像,以及其中的实现原理。
languageX
2021/03/06
24.8K3
图像旋转:getRotationMatrix2D详解--无损失旋转图片
【图像处理】详解 最近邻插值、线性插值、双线性插值、双三次插值「建议收藏」
2.1 最近邻插值 (Nearest Neighbor Interpolation) —— 零阶插值法
全栈程序员站长
2022/09/06
20.9K0
【图像处理】详解 最近邻插值、线性插值、双线性插值、双三次插值「建议收藏」
差分算法及模板详解
然后构造数组b,b[1],b[2]…b[n]为差分数组。其中通过差分数组的前缀和来表示a数组,即a[n] = b[1] + b[2]+…+b[n]。
timerring
2023/05/24
9850
差分算法及模板详解
深入理解双线性插值算法
看了好几篇关于双线性插值算法的博文,解释得都不好理解,不过下面这篇博文就解释得很好,以下内容均参考这篇:
全栈程序员站长
2022/09/06
1.6K0
深入理解双线性插值算法
ROI Align和图像的双线性内插法讲解
最近在看Mask R-CNN,了解到其边框包裹紧密的原因在于将 Roi Pooling 层替换成了 RoiAlign 层,后者舍去了近似像素取整数的量化方法,改用双线性插值的方法确定特征图坐标对应于原图中的像素位置。本文整理了双线性插值的一些知识,便于更好的理解其中的操作。
泽霖
2023/11/22
5980
OpenCV 图像分析之 —— 霍夫变换(Hough Transform)
Hough(霍夫)变换是一种用于检测线、圆或者图像中其他简单形状的方法。最初Hough变换是一种线变换,这是一种相对较快的检测二值图像中直线的方法,可以进一步推广到除简单线之外的情况。
为为为什么
2022/08/09
5.4K0
OpenCV 图像分析之 —— 霍夫变换(Hough Transform)
【OpenCV】双线性插值法
定义: 又称双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向上分别进行一次线性插值。 对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v) (其中i、j均为浮点坐标的整数部分,u、v为浮点坐标的小数部分,是取值[0,1)区间的浮点数),则这个像素得值 f(i+u,j+v) 可由原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1) 其中f(i,j)表示源图像(i,j)处的的像素值,以此类推。
全栈程序员站长
2022/06/28
1.5K0
【OpenCV】双线性插值法
推荐阅读
相关推荐
详细解读Spatial Transformer Networks(STN)-一篇文章让你完全理解STN了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档