Machine Vision Technology:Lecture2 Linear filtering

Machine Vision Technology:Lecture2 Linear filtering

    • Types of Images
    • Image denoising图像去噪
    • Defining convolution卷积的定义
    • Key properties卷积的关键属性
    • 卷积的其它属性
    • Annoying details
    • 卷积练习
    • Sharpening锐化
    • Gaussian Kernel
    • Noise噪声 分类
    • Gaussian noise高斯噪声
    • Reducing salt-and-pepper noise:Median filtering中值滤波
    • Sharpening revisited:再看锐化
    • Edge detection | Origin of edges
    • Characterzing edges描述边缘
    • Image gradient图像梯度

计算机视觉(本科) 北京邮电大学 鲁鹏


Types of Images

二进制图像Binary:黑白图像。0表示Black,1表示White。

灰度图像Grayscale:每个像素用范围在0-255的灰度值表示。

彩色图像Color:RGB三通道。

Image denoising图像去噪

Moving average移动平均:一种通过使用过去若干时间段的平均值计算得出的平均值。移动平均值会定期变化,最早的数值会被基于最新数据的数值所替代。

  • 用邻域的加权平均值替换每个像素
  • 权重被称为滤波器核 filter kernel

一个3x3的权重为平均值的滤波核:

在这里插入图片描述

Defining convolution卷积的定义

Let f be the image and g be the kernel. The output of convolving fwith g is denoted f * g.

f f f 为图像, g g g 为核, f f f g g g 的卷积输出定义为 f ∗ g f*g fg
( f ∗ g ) [ m , n ] = ∑ k , l f [ m − k , n − l ] g [ k , l ] (f*g)[m,n] = \sum_{k,l}{f[m-k, n-l]g[k,l]} (fg)[m,n]=k,lf[mk,nl]g[k,l]
对卷积进一步展开:
( f ∗ g ) [ m , n ] = ∑ k , l f [ m − k , n − l ] g [ k , l ] = ∑ k = − 1 k = 1 ∑ l = − 1 l = 1 f [ m − k , n − l ] g [ k , l ] \begin{align} (f*g)[m,n] &= \sum_{k,l}{f[m-k, n-l]g[k,l]} \\ &= \sum_{k=-1}^{k=1} \sum_{l=-1}^{l=1} {f[m-k, n-l]g[k,l]} \end{align} (fg)[m,n]=k,lf[mk,nl]g[k,l]=k=1k=1l=1l=1f[mk,nl]g[k,l]

假设有f为7x7,g为3x3的卷积核,此时k取-1、0、1,l取-1、0、1。

卷积示意图如下:

请添加图片描述

当m=2,n=2时:卷积操作如下
( f ∗ g ) [ 2 , 2 ] = ∑ k , l f [ 2 − k , 2 − l ] g [ k , l ] = ∑ k = − 1 k = 1 ∑ l = − 1 l = 1 f [ 2 − k , 2 − l ] g [ k , l ] = f [ 3 , 3 ] g [ − 1 , − 1 ] + f [ 3 , 2 ] g [ − 1 , 0 ] + f [ 3 , 1 ] g [ − 1 , 1 ] + f [ 2 , 3 ] g [ 0 , − 1 ] + f [ 2 , 2 ] g [ 0 , 0 ] + f [ 2 , 1 ] g [ 0 , 1 ] + f [ 1 , 3 ] g [ 1 , − 1 ] + f [ 1 , 2 ] g [ 1 , 0 ] + f [ 1 , 1 ] g [ 1 , 1 ] \begin{align} (f*g)[2,2] &= \sum_{k,l}{f[2-k, 2-l]g[k,l]} \\ &= \sum_{k=-1}^{k=1} \sum_{l=-1}^{l=1} {f[2-k, 2-l]g[k,l]} \\ &= f[3,3]g[-1,-1] + f[3,2]g[-1,0] + f[3,1]g[-1,1] \\ &+ f[2,3]g[0,-1] + f[2,2]g[0,0] + f[2,1]g[0,1] \\ &+ f[1,3]g[1,-1] + f[1,2]g[1,0] + f[1,1]g[1,1] \end{align} (fg)[2,2]=k,lf[2k,2l]g[k,l]=k=1k=1l=1l=1f[2k,2l]g[k,l]=f[3,3]g[1,1]+f[3,2]g[1,0]+f[3,1]g[1,1]+f[2,3]g[0,1]+f[2,2]g[0,0]+f[2,1]g[0,1]+f[1,3]g[1,1]+f[1,2]g[1,0]+f[1,1]g[1,1]

示意图如下:
请添加图片描述

卷积核是翻转的:ppt中的图给成了镜像翻转,但上面推导怎么是旋转180度?

请添加图片描述

Key properties卷积的关键属性

  • 线性性质Linearity: f i l t e r ( f 1 + f 2 ) = f i l t e r ( f 1 ) + f i l t e r ( f 2 ) filter(f_1 + f_2) = filter(f_1) + filter(f_2) filter(f1+f2)=filter(f1)+filter(f2)
  • 平移不变性Shift invariance: f i l t e r ( s h i f t ( f ) ) = s h i f t ( f i l t e r ( f ) ) filter(shift(f)) = shift(filter(f)) filter(shift(f))=shift(filter(f))
  • 理论结果Theoretical result:通过理论分析和计算得出的预测性结果:任何线性平移不变算子都可以表示为卷积

卷积的其它属性

  • 交换律Commutative: a ∗ b = b ∗ a a * b = b * a ab=ba

    从概念上讲,滤波器和信号没有区别

  • 结合律Associative: a ∗ ( b ∗ c ) = ( a ∗ b ) ∗ c a*(b*c)=(a*b)*c a(bc)=(ab)c

  • 分配律Distributes over addition: a ∗ ( b + c ) = a ∗ b + a ∗ c a*(b+c) = a*b + a*c a(b+c)=ab+ac

  • 标量因子提出Scalars factor out: k a ∗ b = a ∗ k b = k ( a ∗ b ) ka*b = a*kb = k(a*b) kab=akb=k(ab)

  • 同一性Identity:单位脉冲unit impulse e = [ . . . , 0 , 0 , 1 , 0 , 0 , . . . ] e = [..., 0,0,1,0,0,...] e=[...,0,0,1,0,0,...] a ∗ e = a a*e=a ae=a

Annoying details

卷积的输出结果与填充方式有关:在MATLAB中

filter2(g, f, shape)
  • shape='full':输出大小是f和g的和
  • shape='same':输出大小和f相同
  • shape='valid':输出大小是f和g的差

请添加图片描述

图像进行外推填充方式:

  • clip filter (black): imfilter(f, g, 0) 周围补一圈黑色,像素为0的黑边
  • wrap around: imfilter(f, g, ‘circular’) 图像右侧边缘补到左边,左侧边缘补到右边,类似圆筒,上下类似。
  • copy edge: imfilter(f, g, ‘replicate’) 拉伸边缘像素
  • reflect across edge: imfilter(f, g, ‘symmetric’) 镜像边缘像素

卷积练习

请添加图片描述

用右侧像素替代当前像素,相当于左移。

请添加图片描述

用box滤波器进行Blur模糊:

请添加图片描述

锐化滤波器Sharpening filter:突出和平均值的差异

请添加图片描述

Sharpening锐化

请添加图片描述

假设用 I I I 表示原图, e e e 表示单位脉冲,g表示box filter,上述过程表示如下:

原图减去滤波后的图: I ∗ e − I ∗ g = I ∗ ( e − g ) I*e - I*g = I*(e-g) IeIg=I(eg)

然后: I ∗ e + I ∗ ( e − g ) = I ∗ ( 2 e − g ) I*e + I*(e-g) = I*(2e - g) Ie+I(eg)=I(2eg)

所以可以用新的滤波器 2 e − g 2e-g 2eg 与原图进行卷积,直接得到sharpened图像。

请添加图片描述

Gaussian Kernel

为了消除边缘影响,根据邻近像素与中心的接近程度对其权重贡献。
G σ = 1 2 π σ 2 e − ( x 2 + y 2 ) 2 σ 2 G_{\sigma} = \frac{1}{2 \pi \sigma^2} e^{- \frac{(x^2 + y^2)}{2 \sigma^2}} Gσ=2πσ21e2σ2(x2+y2)
请添加图片描述

5x5高斯模版生成过程:

  • 中心坐标为(0,0),右边为(1,0),其余以此类推。
  • 将坐标的x和y带入高斯函数得到值。
  • 所有值还需要进行归一化(某个值除以所有值的和)。

模版的所有值加和为1,使模版操作不改变图像亮度。


  • 标准偏差 σ \sigma σ 决定平滑程度
  • 当固定模版的大小时:

σ \sigma σ 越小,模版的中间值越大,所占比重较大,被平滑的不那么厉害。

σ \sigma σ 越大,模版的中间值越小,所占权重变小,被平滑的厉害。

请添加图片描述

  • σ \sigma σ 固定时,模版大小改变:

请添加图片描述

当size为10时,模版有100个值,size为30时,模版有900个值,再归一化后,size小的模版权重相对更大些。

因此size较小时,被平滑的不那么厉害;size较大时,平滑的厉害。

  • 模版大小选取遵循原则:将滤波器半宽度设置为约 3 σ 3\sigma 3σ。滤波器大小为 3 σ + 3 σ + 1 3\sigma + 3\sigma + 1 3σ+3σ+1。例如 σ = 1 \sigma=1 σ=1 时,滤波器大小为3x3

高斯滤波器特点:

  • 从图像中去除“高频”成分(低通滤波器)

  • 高斯滤波与自身的卷积是另一个高斯滤波器。

    例如连续两个标准差为 σ \sigma σ 的高斯核进行卷积,等价于一个标准差为 2 σ \sqrt{2} \sigma 2 σ 高斯核进行卷积。遵循勾股定理。

    1.将原图进行参数为 σ \sigma σ 的高斯滤波: I ′ = I ∗ g σ I' = I * g_{\sigma} I=Igσ

    2.将上面结果进行参数为 σ \sigma σ 的高斯滤波: I ′ ′ = I ′ ∗ g σ I'' = I' * g_{\sigma} I′′=Igσ

    3.等价与直接将原图进行参数为 2 σ \sqrt{2} \sigma 2 σ 的高斯滤波: I ′ ′ = I ∗ g 2 σ I'' = I * g_{\sqrt{2} \sigma} I′′=Ig2 σ

  • 可分离核Separable Kernel:二维高斯函数可以被表示为两个一维高斯函数的乘积。

G σ ( x , y ) = 1 2 π σ 2 e − ( x 2 + y 2 ) 2 σ 2 = ( 1 2 π σ e − x 2 2 σ 2 ) ( 1 2 π σ e − y 2 2 σ 2 ) \begin{align} G_{\sigma}(x,y) &= \frac{1}{2 \pi \sigma^2} e^{- \frac{(x^2 + y^2)}{2 \sigma^2}} \\ &= (\frac{1}{2 \pi \sigma} e^{- \frac{x^2}{2 \sigma^2}})(\frac{1}{2 \pi \sigma} e^{- \frac{y^2}{2 \sigma^2}}) \\ \end{align} Gσ(x,y)=2πσ21e2σ2(x2+y2)=(2πσ1e2σ2x2)(2πσ1e2σ2y2)

可分离性的例子:Separability example

首先使用2D高斯滤波器对中心位置进行卷积:求得结果是65。

请添加图片描述

2D高斯滤波器可以分解为两个一维高斯滤波器的乘积:

请添加图片描述

使用分解的两个一维高斯滤波器原原图像依次卷积:行卷积核列卷积。最终得到结果仍然是65.

请添加图片描述

请添加图片描述

Separability分离性的用途:

n × n n \times n n×n 的图像,使用 m × m m \times m m×m 的核进行卷积的复杂度: O ( n 2 m 2 ) O(n^2 m^2) O(n2m2)

如果使用分离的卷积的复杂度: O ( n 2 m ) + O ( n m ) = O ( n 2 m ) O(n^2 m) + O(n m) = O(n^2 m) O(n2m)+O(nm)=O(n2m)

Noise噪声 分类

  • 椒盐噪声Salt and pepper noise:包含随机出现的黑色和白色像素。
  • 脉冲噪声Impulse noise:包含随机出现的白色像素。
  • 高斯噪声Gaussian noise:从高斯正态分布得出的强度变化

请添加图片描述

Gaussian noise高斯噪声

高斯噪声图 f ( x , y ) f(x,y) f(x,y) 的产生如下:
f ( x , y ) = f ˉ ( x , y ) + η ( x , y ) f(x, y) = \bar{f}(x, y) + \eta(x,y) f(x,y)=fˉ(x,y)+η(x,y)
其中 f ˉ ( x , y ) \bar{f}(x,y) fˉ(x,y) 为理想的图像, η ( x , y ) \eta(x,y) η(x,y) 为噪声处理,所有噪声iid于正态分布:
η ( x , y ) ∼ N ( μ , σ ) \eta(x,y) \sim \mathbf{N}(\mu, \sigma) η(x,y)N(μ,σ)
假设:独立,均值为0的噪声

请添加图片描述

  • 减少高斯噪声Reducing Gaussian noise:使用高斯滤波器

请添加图片描述

上图中第一行是 σ \sigma σ 取 0.05、0.1、0.2 产生的高斯噪声图。也就对应没有平滑的图。

第二行是使用 σ = 1 \sigma = 1 σ=1 的高斯滤波结果,此时高斯核大小为 7 × 7 7 \times 7 7×7

第三行是使用 σ = 2 \sigma = 2 σ=2 的高斯滤波结果,此时高斯核大小为 13 × 13 13 \times 13 13×13

结论:使用较大标准差的平滑可以抑制噪声, 但也会使图像模糊。

Reducing salt-and-pepper noise:Median filtering中值滤波

中值滤波器通过选择窗口中的中值强度对窗口进行操作。

请添加图片描述

中值滤波是非线性滤波。对异常值具有稳健性的优点:Robustness to outliers

请添加图片描述

下面是有椒盐噪声的图和均值滤波后的图:

请添加图片描述

Sharpening revisited:再看锐化

请添加图片描述

拉普拉斯高斯:

请添加图片描述

Edge detection | Origin of edges

  • 边缘检测目标:识别图像中的突变(不连续)。直观地说,大多数来自图像的语义和形状信息都可以编码在边缘中。

各种边的起源(种类):边缘是由多种因素造成的

请添加图片描述

  • surface normal discontinuity表面法向不连续:也就是面上的不连续,两个面的交界处产生的边。
  • depth discontinuity间断面深度:深度上的边缘,上面瓶子因为是圆形的,本身没有边,但图像只能显示其中的一部分,由于深度上的不连续形成的边。
  • surface color discontinuity表面颜色不连续:文字。
  • illumination discontinuity照明不连续:阴影产生的边。

Characterzing edges描述边缘

边缘是图像强度函数中快速变化的地方:一阶导的极值点。

请添加图片描述

对于2D函数 f ( x , y ) f(x,y) f(x,y) 的偏导数定义:
∂ f ( x , y ) ∂ x = lim ⁡ ϵ → 0 f ( x + ϵ , y ) − f ( x , y ) ϵ \frac{\partial f(x,y)}{\partial x} = \lim_{\epsilon \to 0} \frac{f(x + \epsilon,y) - f(x,y)}{\epsilon} xf(x,y)=ϵ0limϵf(x+ϵ,y)f(x,y)
对于离散数据,我们可以使用有限差分进行近似:
∂ f ( x , y ) ∂ x ≈ f ( x + 1 , y ) − f ( x , y ) 1 \frac{\partial f(x,y)}{\partial x} \approx \frac{f(x + 1,y) - f(x,y)}{1} xf(x,y)1f(x+1,y)f(x,y)
为了实现上面的卷积,相关的过滤器如何设计?

请添加图片描述

左图的滤波器: [ − 1 , 1 ] [-1,1] [1,1] 。水平方向卷积,求得垂直方向边缘。

右图的滤波器: [ − 1 , 1 ] T [-1,1]^T [1,1]T [ 1 , − 1 ] T [1,-1]^T [1,1]T 。垂直方向卷积,求得水平方向边缘。

Image gradient图像梯度

图像的梯度是由偏导数组成的向量:
∇ f = [ ∂ f ∂ x , ∂ f ∂ y ] \nabla f = [\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}] f=[xf,yf]

  • 梯度方向指向信号变化最大的方向,也就是指向图像强度增加最快的方向。
  • 梯度方向与边缘垂直。

请添加图片描述

梯度方向定义:
θ = t a n − 1 ( ∂ f ∂ y / ∂ f ∂ x ) \theta = tan^{-1} (\frac{\partial f}{\partial y} / \frac{\partial f}{\partial x}) θ=tan1(yf/xf)
边缘强度由梯度幅度给出:The edge strength is given by the gradient magnitude
∣ ∣ ∇ f ∣ ∣ = ( ∂ f ∂ x ) 2 + ( ∂ f ∂ y ) 2 || \nabla f || = \sqrt{(\frac{\partial f}{\partial x})^2 + (\frac{\partial f}{\partial y})^2} ∣∣∇f∣∣=(xf)2+(yf)2

  • 使用梯度幅值来描述是否是边的可能性,幅值越大,偏导数越大,偏导数越有可能是极值点,则该点越有可能是边。这也叫做边缘强度。

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/268865.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇了解电阻的使用

目录 一、电阻理论基础 1.电阻的定义 2.欧姆定律 3.电阻决定式 4.电阻的串并联​编辑 5.电阻的功率 6.温度对电阻的影响 二、电阻的选型 1.安装方式 2.电阻值 (1)电阻值的标称 (2)电阻值的确定 (3&#x…

如何在Linux使用Docker部署Redis并结合内网穿透实现公网远程连接本地数据库

文章目录 前言1. 安装Docker步骤2. 使用docker拉取redis镜像3. 启动redis容器4. 本地连接测试4.1 安装redis图形化界面工具4.2 使用RDM连接测试 5. 公网远程访问本地redis5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 正文开始前给大家推荐个网站…

游戏引擎分层简介

游戏引擎分层架构(自上而下) 工具层(Tool Layer) 在一个现代游戏引擎中,我们最先看到的可能不是复杂的代码,而是各种各样的编辑器,利用这些编辑器,我们可以制作设计关卡、角色、动画…

远程调用--webClient

远程调用webClient 前言1、创建webClient2、准备数据3、执行请求4、接收返回响应到的数据整体代码 前言 非阻塞、响应式HTTP客户端 1、创建webClient WebClient client WebClient.create();2、准备数据 Map<String,String> params new HashMap<>();params.pu…

Tabby-全网最详细讲解

1.Tabby简介 Tabby是一个无限可定制的跨平台终端应用程序&#xff0c;适用于local shells、serial、SSH和Telnet的连接。 Tabby是基于TypeScript开发的终端模拟器&#xff0c;可用于Linux、Windows和Mac OS系统。 Tabby (前身是 Terminus) 是一个可高度配置的终端模拟器和 SSH …

攻防世界-get_post

题目信息 相关知识 -G&#xff1a;表示GET请求&#xff0c;缺省POST -d参数用于发送 POST 请求的数据体 使用-d参数以后&#xff0c;HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法&#xff0c;因此可以省略-X PO…

智能驾驶规划控制理论学习04-基于车辆运动学的规划方法

目录 一、线性二自由度汽车模型&#xff08;自行车模型&#xff09; 1、二自由度模型概述 2、不同参考点下的状态空间方程 3、前向仿真 二、运动基元生成方法 1、杜宾斯曲线&#xff08;Dubins Curve&#xff09; 2、Reeds Shepp Curve 三、多项式曲线&#xff08;Poly…

如何本地创建websocket服务端并发布到公网实现远程访问

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

微服务监控SpringBoot Actuator模块

Spring Boot Actuator Spring Boot 包含许多附加功能&#xff0c;可帮助您在将应用程序投入生产时监控和管理应用程序。您可以选择使用 HTTP 端点或 JMX 来管理和监控您的应用程序。审核、运行状况和指标收集也可以自动应用于您的应用程序。 简介 Spring Boot Actuator模块提…

参数引入和全局变量引入实现-目标和

LCR 102. 目标和 - 力扣&#xff08;LeetCode&#xff09; 分析题意&#xff0c;画出决策树&#xff0c;其他的思路都跟前面讲过的类似&#xff1a; 全局变量引入实现&#xff1a; 全局变量的引入&#xff0c;需要手动处理回溯&#xff1b; class Solution {int ret; //…

智慧公厕:打造智慧城市的环卫明珠

在城市建设中&#xff0c;公共卫生设施的完善和智能化一直是重要环节。而智慧公厕作为智慧城市建设的重要组成部分&#xff0c;发挥着不可替代的作用。本文以智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;大量精品案例现场实景实图&#xff0c;解读智慧公厕如何助力打…

SwiftUI 在 App 中弹出全局消息横幅(下)

功能需求 在 SwiftUI 开发的 App 界面中,有时我们需要在全局层面向用户展示一些消息: 如上图所示:我们弹出的全局消息横幅位于所有视图之上,这意味这它不会被任何东西所遮挡;而且用户可以点击该横幅关闭它。这是怎么做到的呢? 在本篇博文中,您将学到以下内容 功能需求…

自测-5 Shuffling Machine(python版本)

文章预览&#xff1a; 题目翻译算法python代码oj反馈结果 题目 翻译 shuffle是用于随机化一副扑克牌的过程。由于标准的洗牌技术被认为是薄弱的&#xff0c;并且为了避免员工通过不适当的洗牌与赌徒合作的“内部工作”&#xff0c;许多赌场使用了自动洗牌机。你的任务是模拟一…

探索Linux世界:初次接触和基本指令(文件操作)

文章目录 1.基本介绍和准备2.基本指令和Linux的基本操作3.几个重要基本指令3.1 ls - 列出文件和目录3.1.1文件的知识3.1.2 .和..文件 3.2pwd - 显示当前工作目录3.2.1路径知识 3.3 cd - 切换目录3.4 touch - 创建文件或更新时间戳3.5mkdir - 创建新目录3.6rm - 删除文件或目录3…

[技巧]Arcgis之图斑四至范围批量计算

ArcGIS图层&#xff08;点、线、面三类图形&#xff09;四至范围计算 例外一篇介绍&#xff1a;[技巧]Arcgis之图斑四至点批量计算 说明&#xff1a;如下图画出来的框&#xff08;范围标记不是很准&#xff09; &#xff0c;图斑的x最大和x最小&#xff0c;y最大&#xff0c;…

MySQL Strict Mode is not set for database connection ‘default‘

在使用 DJango 框架执行迁移文件的命令时&#xff0c;可以看到出现如下警告&#xff1a; (ll_env) D:\workspace\workspace-mengll\learning-log>python manage.py migrate System check identified some issues: WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set …

【动态规划专栏】

动态规划基础知识 概念 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;&#xff1a;用来解决最优化问题的算法思想。 动态规划是分治思想的延伸&#xff0c;通俗一点来说就是大事化小&#xff0c;小事化无的艺术。 一般来说&#xff0c;…

账单怎么记账软件下载,佳易王账单记账汇总统计管理系统软件教程

账单怎么记账软件下载&#xff0c;佳易王账单记账汇总统计管理系统软件教程 一、前言 以下软件以 佳易王账单记账汇总统计管理系统软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 软件特色&#xff1a; 1、功能实用&#xff0c;操作…

Vue之监测数据的原理(对象)

大家有没有想过&#xff0c;为什么vue可以监测到数据发生改变&#xff1f;其实底层借助了Object.defineProperty&#xff0c;底层有一个Observer的构造函数 让我为大家简单的介绍一下吧&#xff01; 我用对象为大家演示一下 const vm new Vue({el: "#app",data: {ob…

力扣hot100:42.接雨水

什么时候能用双指针&#xff1f; &#xff08;1&#xff09;对撞指针&#xff1a; ①两数和问题中可以使用双指针&#xff0c;先将两数和升序排序&#xff0c;可以发现规律&#xff0c;如果当前两数和大于target&#xff0c;则右指针向左走。 ②接雨水问题中&#xff0c;左边最…