第三章 图像的低通与高通滤波

这篇具有很好参考价值的文章主要介绍了第三章 图像的低通与高通滤波。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

前面讲解了一些图像的基本理论以及操作,这一张将聚焦与图像的滤波操作。

一、卷积操作

解释:

图像卷积是一种在图像处理中广泛使用的操作。其基本思想是在图像的每个像素点上,以该点为中心选择一个固定大小的滤波器模板(通常是一个矩阵),并将该滤波器与该像素点及其相邻像素点进行卷积运算,生成一个新的像素值。通过将该滤波器模板与整张图像进行卷积操作,我们可以对图像进行一些线性操作,例如模糊、锐化、边缘检测等。

“卷积”这个术语最初是从数学领域中引入到信号和图像处理领域的。在数学中,卷积是两个函数之间的一种数学运算,它在函数之间进行加权平均的积分运算,可以用来描述信号在系统中的传递和变形过程。在信号和图像处理中,卷积操作的本质是一种加权平均的过程,它考虑不同像素对卷积结果的贡献程度,从而实现一些常见的图像处理操作。
高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理

OpenCV中的一个函数----cv2.filter2D,可用于实现这种卷积运算操作。

cv2.filter2D函数的调用格式如下:

cv2.filter2D(src, ddepth, kernel, dst=None, anchor=None, borderType=None)

函数的参数解释如下:

  • src:需要执行卷积操作的输入图像,可以是单通道或多通道图像。
  • ddepth:输出图像的深度(即数据类型),通常设置为-1,表示和输入图像的深度相同。
  • kernel:定义卷积操作的核,可以是任意大小的数组。
  • dst:卷积操作的输出图像,可以选择是否使用。
  • anchor:表示卷积核的锚点,通常设置为(-1, -1),表示锚点位于核的中心。
  • borderType:处理边界问题的方法,默认为cv2.BORDER_DEFAULT,表示默认使用边界反射。其它可选值包括cv2.BORDER_CONSTANTcv2.BORDER_REPLICATE等。

注:边界像素周围可能不够卷积核的大小,因此边界需要进行边界扩展,这也就是filter2D中设置borderType参数的原因。

二、低通滤波

作用:

  • 消除图片中的高斯噪声
  • 消除图片中的椒盐噪声
  • 图片模糊

高斯噪声是一种线性加性噪声,通常表示为服从高斯分布(正态分布)的随机变量的噪声。高斯噪声在图像处理中非常常见,特别是在图像传感器、摄像头、图像压缩等过程中,由于各种原因(如热噪声、传感器噪声、电子噪声、压缩算法噪声等),会产生随机干扰信号,从而引入高斯噪声。

椒盐噪声是一种常用的数字图像噪声模型,它是指在一幅图像中将一些像素点随机地变成纯黑色或纯白色。这种噪声通常是由于图像采集或传输中的信号干扰引起的,也可以是为了模拟真实世界中的图像失真而添加的。椒盐噪声会破坏图像的细节和纹理,导致图像质量下降,并使图像的分析和处理变得更为困难。

1. 方盒滤波与均值滤波

  • 卷积核
    K = α [ 1 1 ⋯ 1 1 1 ⋯ 1 ⋮ ⋮ ⋯ ⋮ 1 1 ⋯ 1 ] h × w K = \alpha \begin{bmatrix} 1 & 1 & \cdots &1\\ 1 & 1 & \cdots &1\\ \vdots & \vdots & \cdots &\vdots\\ 1 & 1 & \cdots &1\\\end{bmatrix}_{h×w} K=α 111111111 h×w
  • α = 1 h × w \alpha=\frac{1}{h×w} α=h×w1时,该卷积核是实现均值滤波。当 α \alpha α等于1时,该卷积实现的是方盒滤波,当像素值超出255时值为255。
# 方盒滤波
# normalize:正交化,一般都设置为 True,此时等同于均值滤波
cv2.boxFilter(src, ddepth, kernelSize:tuple[, dst[, anchor[, normalize[, borderType]]]]) -> dst

# 均值滤波
cv2.blur(src, kernelSize:tuple[, dst[, anchor[, borderType]]]) -> dst

高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理

2. 中值滤波

  • 实现:对卷积核框住的像素值进行排序,取中间值作为输出结果。
    cv2.medianBlur(src, kernelSize:int[, dst]) -> dst
    
  • 效果:适合去除椒盐噪声
    高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理

3.高斯滤波

3.1 高斯分布

根据本科期间所学习的概率论可知,高斯分布是一种连续型的分布,具有概率密度函数,包括一维以及二维高斯分布:

  • 一维高斯分布
    • 概率密度函数: f ( x ) = 1 σ 2 π e − ( x − μ ) 2 2 σ 2 f(x) = \frac{1}{\sigma\sqrt[]{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}} f(x)=σ2π 1e2σ2(xμ)2 ,其中 μ \mu μ为样本均值,图像上表现为高峰的横坐标, σ \sigma σ为样本标准差,图像上表现为高峰的高度。标准差越大越不均匀,因此曲线比较平缓。
  • 二维高斯分布
    -概率密度函数: f ( x , y ) = 1 2 π σ x σ y 1 − ρ 2 exp ⁡ ( − 1 2 ( 1 − ρ 2 ) [ ( x − μ x ) 2 σ x 2 + ( y − μ y ) 2 σ y 2 − 2 ρ ( x − μ x ) ( y − μ y ) σ x σ y ] ) f(x,y) = \frac{1}{2\pi \sigma_x \sigma_y \sqrt{1-\rho^2}}\exp{\Big(-\frac{1}{2(1-\rho^2)}\big[\frac{(x-\mu_x)^2}{\sigma_x^2} + \frac{(y-\mu_y)^2}{\sigma_y^2} - \frac{2\rho(x-\mu_x)(y-\mu_y)}{\sigma_x \sigma_y}\big]\Big)} f(x,y)=2πσxσy1ρ2 1exp(2(1ρ2)1[σx2(xμx)2+σy2(yμy)2σxσy2ρ(xμx)(yμy)]),其中, x x x y y y 表示二维空间中的横、纵坐标, μ x \mu_x μx μ y \mu_y μy 表示两个坐标轴上的均值, σ x 2 \sigma_x^2 σx2 σ y 2 \sigma_y^2 σy2 分别表示两个方向上的方差, ρ \rho ρ 表示两个方向上的相关系数。高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理
    二维高斯分布太复杂,作如下假设:
    • μ 1 = μ 2 = 0 \mu_1=\mu_2=0 μ1=μ2=0
    • ρ = 0 \rho=0 ρ=0
      f ( x , y ) = 1 2 π σ x σ y exp ⁡ ( − 1 2 [ x 2 σ x 2 + y 2 σ y 2 ] ) f(x,y) = \frac{1}{2\pi \sigma_x \sigma_y} \exp{\Big(-\frac{1}{2}\big[\frac{x^2}{\sigma_x^2} + \frac{y^2}{\sigma_y^2}\big]\Big)} f(x,y)=2πσxσy1exp(21[σx2x2+σy2y2])

3.2 滤波流程

  1. 假定卷积核的中心坐标(x, y)为(0, 0),然后得到周围的坐标值:
    高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理
  2. 将坐标值带入简化后的二维高斯分布概率密度函数,并取 σ 1 = σ 2 = 1.5 \sigma_1=\sigma_2=1.5 σ1=σ2=1.5
    高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理
  3. 由于计算得到的值为概率密度,并非概率值,所以还需要转为概率。用每个值除以卷积核的总和得到概率值,从而得到高斯模板卷积核:
    高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理
  4. 整数高斯模板:所有概率之和除以左上角的概率值,然后四舍五入获得整数值,最后还要再归一化,前面加个 1 所有整数和 \frac{1}{所有整数和} 所有整数和1

为啥需要整数的高斯模板我不太清楚。

  1. 最后用获得的高斯模板卷积核进行卷积运算。

3.2 OpenCV代码及手动实现

  • 手动实现高斯滤波:

    import numpy as np
    import cv2
    
    
    def naive_gaussian_blur(img, kernel_size, sigma):
        half_kernel_size = kernel_size // 2
        kernel = np.zeros((kernel_size, kernel_size), dtype=np.float32)
    
        constant = 1 / (2 * np.pi * sigma**2)
    
        for i in range(-half_kernel_size, half_kernel_size + 1):   #-2到2
            for j in range(-half_kernel_size, half_kernel_size + 1):
                kernel[i + half_kernel_size, j + half_kernel_size] = constant * np.exp(
                    -(i**2 + j**2) / (2 * sigma**2)
                )
    
        kernel /= kernel.sum()  #获取概率值
    
        output = np.zeros_like(img, dtype=np.float32)
    
        for x in range(half_kernel_size, img.shape[0] - half_kernel_size):
            for y in range(half_kernel_size, img.shape[1] - half_kernel_size):
                output[x, y] = np.sum(
                    img[
                        x - half_kernel_size : x + half_kernel_size + 1,
                        y - half_kernel_size : y + half_kernel_size + 1,
                    ]
                    * kernel
                )
    
        output = np.clip(output, 0, 255).astype(np.uint8)
    
        return output
    
    
    img = cv2.imread("F:/MyOpenCV/ai.jpg", cv2.IMREAD_GRAYSCALE)
    img = cv2.resize(img, (0, 0), fx=0.3, fy=0.3, interpolation=cv2.INTER_LINEAR)
    blurred_img = naive_gaussian_blur(img, kernel_size=5, sigma=2)
    cv2.imshow("Original Image", img)
    cv2.imshow("Blurred Image", blurred_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理

  • OpenCV高斯滤波接口:

# sigmaX :x 的标准差,不指定的话,根据 kernelSize 进行计算
# sigmaY :y 的标准差,默认等于 sigmaX 
cv2.GaussianBlur(src, kernelSize:tuple, sigmaX[, dst[, sigmaY[, borderType]]]) -> dst

4. 双边滤波

4.1 原理

  • 原因: 高斯滤波在除去高斯噪声的同时,也会不加区分的将图像中的边缘一并给加权平均了,所以就导致图片整体看起来很模糊。为了保护边缘,就产生了双边滤波算法
  • 图像边缘: 边缘的产生就是因为相邻的像素的颜色通道差别太大,因此,对相邻像素的颜色做差,就能标记出边缘(差值越大,就说明边缘的可能性越大)
  • 算法思路: 在高斯滤波的基础上再添加一个灰度距离权重。灰度距离越大,灰度距离的权重越小,这样像素在高斯模糊中的占比就越小,进而实现只对颜色相近的像素进行高斯滤波。
  • 当对图像进行双边滤波处理时,可以在每个像素处应用以下公式:

I b f = 1 W ∑ p ∈ K G s ( p ) G r ( p ) I p \mathrm{I_{bf}=\frac{1}{W}\sum_{p\in K}G_s(p)G_r(p)I_p} Ibf=W1pKGs(p)Gr(p)Ip

  • I b f I_{bf} Ibf卷积操作后的像素输出值
  • K K K 卷积核框住的范围
  • G s ( p ) G_s(p) Gs(p)高斯概率密度函数,卷积核中心像素坐标是 q ( x q , y q ) q(x_q,y_q) q(xq,yq),卷积核中的任一像素是 p ( x p , y p ) p(x_p,y_p) p(xp,yp):
    G s ( p ) = exp ⁡ ( − ∣ ∣ p − q ∣ ∣ 2 2 σ s 2 ) = exp ⁡ ( − ( x p − x q ) 2 + ( y p − y q ) 2 2 σ s 2 ) \begin{aligned} \mathrm{G_s(p)}& =\exp{(-\frac{||\mathrm{p}-\mathrm{q}||^2}{2\mathrm{\sigma}_\mathrm{s}^2})} \\ &=\exp{(-\frac{\mathrm{(x_p-x_q)^2+(y_p-y_q)^2}}{2\sigma_s^2})} \end{aligned} Gs(p)=exp(2σs2∣∣pq2)=exp(2σs2(xpxq)2+(ypyq)2)
  • G r ( p ) G_r(p) Gr(p) 是灰度值距离权重,灰度距离越大,灰度距离权重越小。卷积核中心像素 I q I_q Iq是卷积核中心, I p I_p Ip是卷积核中的任意一点。

G r ( p ) = exp ⁡ ( − ∣ ∣ I p − I q ∣ ∣ 2 2 σ r 2 ) = exp ⁡ ( − [ gray ⁡ ( I p ⁡ ) − gray ⁡ ( I q ⁡ ) ] 2 2 σ r 2 ) \begin{aligned} \mathrm{G_r(p)}& =\exp(-\frac{||\mathrm{I_p-I_q}||^2}{2\mathrm{\sigma_r^2}}) \\ &=\exp(-\frac{[\operatorname{gray}(\operatorname{I_p})-\operatorname{gray}(\operatorname{I_q})]^2}{2\sigma_\mathrm{r}^2}) \end{aligned} Gr(p)=exp(2σr2∣∣IpIq2)=exp(2σr2[gray(Ip)gray(Iq)]2)

  • W : ∑ p ∈ K G s ( p ) G r ( p ) \mathrm{W:\sum_{p\in K}G_s(p)G_r(p)} W:pKGs(p)Gr(p)的值并不等于1,所以还需要进行权重的归一化:
    W = ∑ p ∈ K G s ( p ) G r ( p ) \mathrm{W=\sum_{p\in K}G_s(p)G_r(p)} W=pKGs(p)Gr(p)

4.2 OpenCV代码实现

# sigmaColor:sigma_s,高斯分布的标准差
# sigmaSpace:sigma_r,灰度距离的控制值 
cv2.bilateralFilter(src, kernelSize:int, sigmaColor, sigmaSpace[, dst[, borderType]]) -> dst

高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理

二、高通滤波

功能:

  • 边缘检测
  • 图像边缘:图像的灰度图中,相邻像素灰度值差距较大的位置。

1. Sobel算子

  • 原理:对图像邻近的灰度像素进行求导,斜率较大的地方,边缘的概率最大。

  • 差分法:图像中近似求导的方法
    I ′ ( x i ) = I ( x i + 1 ) − I ( x i ) x i + 1 − x i {I}'({x_{i})}=\frac{I({x_{i+1}}) - I({x_{i}})}{{x_{i+1}} - {x_{i}}} I(xi)=xi+1xiI(xi+1)I(xi)
    这里只对像素的一个方向进行求偏导(x方向或者y方向)。求导的实际操作仍然是卷积操作,所以对于分母差值也可以省略掉(因为对于同一个卷积核来说左右或者上下的差值是固定的) I ′ ( x i ) = I ( x i + 1 ) − I ( x i ) {I}'({x_{i})}=I({x_{i+1}}) - I({x_{i}}) I(xi)=I(xi+1)I(xi)

  • 卷积核:

    • x方向求偏导:提取竖向的边缘,目标像素左右端的像素进行差值计算
      G x = [ − 1 0 + 1 − 2 0 + 2 − 1 0 + 1 ] G_x = \begin{bmatrix} -1 & 0& +1 \\-2 & 0 & +2 \\-1 & 0 &+1\end{bmatrix} Gx= 121000+1+2+1
    • y方向求偏导:提取横向的边缘,目标像素上下端的像素进行差值计算
      G y = [ − 1 − 2 − 1 0 0 0 + 1 + 2 + 1 ] G_y = \begin{bmatrix} -1 & -2& -1 \\0 & 0 & 0 \\+1 & +2 &+1\end{bmatrix} Gy= 10+120+210+1
# ddepth:cv2.CV_, 结果图像的位深
# dx:对 x 方向求偏导
# dy:对 y 方向求偏导
# ksize:卷积核大小
cv2.Sobel(src, ddepth, dx:bool, dy:bool[, dst[, ksize:int[, scale[, delta[, borderType]]]]]) -> dst
# src中的数据取绝对值
cv2.convertScaleAbs(src[, dst[, alpha[, beta]]]) -> dst

  • sobel计算,会导致像素值为负,因此输出图像的位深ddepth应当使用有符号类型,例如cv2.CV_16Scv2.CV32F等。
  • 颜色通道数值不存在负数,所以还需要对计算结果取绝对值convertScaleAbs。
  • 对于横向、竖向的边界要分两次进行,一起提取效果会很差,具体原因见下方。
分开提取边界原因:这是因为在对一个多元函数同时对不同自变量求导时,往往忽略了它们之间的相互影响和依存关系。具体来说,如果一个函数包含$x$和$y$两个变量,那么对$x$求导时会把$y$看作常数而忽略其对$x$的影响;同样地,对$y$求导时会把$x$看成常数而忽略其对$y$的影响。

高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理

2. Schar算子

  • 介绍:对Sobel算子的改进。
  • 卷积核卷积核大小固定3×3
    • x方向求偏导:提取竖向的边缘,目标像素左右的像素进行差值计算
      G x = [ − 3 0 + 3 − 10 0 + 10 − 3 0 + 3 ] G_x = \begin{bmatrix} -3 & 0& +3 \\-10 & 0 & +10 \\-3 & 0 &+3\end{bmatrix} Gx= 3103000+3+10+3
    • y方向求偏导:提取横向的边缘,目标像素上下的像素进行差值计算
      G y = [ − 3 − 10 − 3 0 0 0 + 3 + 10 + 3 ] G_y = \begin{bmatrix} -3 & -10& -3 \\0 & 0 & 0 \\+3 & +10 &+3\end{bmatrix} Gy= 30+3100+1030+3

OpenCV相关接口:

cv2.Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]]) -> dst

3.拉普拉斯算子

  • 思想: Sobel算子是对像素求解一阶导数,最大值处就是边缘;对一阶导数再求导,那么零值处就是边缘,但是,由于利用差分进行计算而且像素点也是离散的,进度丢失大,这个“零”的表现其实不明显。边界显示的还是主要两边的峰值。

  • 拉普拉斯算子定义:
    ▽ 2 f = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 \bigtriangledown^2 f = \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2} 2f=x22f+y22f

      拉普拉斯算子能表示一个空间曲面的平坦程度,至于为什么这样定义我没有细究。
    
  • 二阶差分
    f(x,y)对x右侧的一阶偏导(因为相邻点像素距离差为1,所以分母为1略去):
    ∂ f ∂ x = f ( x + 1 , y ) − f ( x , y ) \frac{\partial f}{\partial x} = f(x+1,y) - f(x,y) xf=f(x+1,y)f(x,y)
    f(x,y)对x左侧的一阶偏导(同上):
    ∂ f ∂ x = f ( x , y ) − f ( x − 1 , y ) \frac{\partial f}{\partial x} = f(x,y) - f(x-1,y) xf=f(x,y)f(x1,y)
    f(x,y)对x的二阶偏导(右侧一阶减左侧一阶,分母仍然是1略去):
    ∂ 2 f ∂ x 2 = f ( x + 1 , y ) − f ( x , y ) − ( f ( x , y ) − f ( x − 1 , y ) ) = f ( x + 1 , y ) + f ( x − 1 , y ) − 2 f ( x , y ) \begin{aligned} \frac{\partial^2 f}{\partial x^2} &= f(x+1,y) - f(x,y) - (f(x,y) - f(x-1,y)) \\ &= f(x+1,y) + f(x-1,y) - 2f(x,y) \end{aligned} x22f=f(x+1,y)f(x,y)(f(x,y)f(x1,y))=f(x+1,y)+f(x1,y)2f(x,y)
    f(x,y)对y的二阶偏导(同上):
    ∂ 2 f ∂ y 2 = f ( x , y + 1 ) − f ( x , y ) − ( f ( x , y ) − f ( x , y − 1 ) ) = f ( x , y + 1 ) + f ( x , y − 1 ) − 2 f ( x , y ) \begin{aligned} \frac{\partial^2 f}{\partial y^2} &= f(x,y+1) - f(x,y) - (f(x,y) - f(x,y-1)) \\ &= f(x,y+1) + f(x,y-1) - 2f(x,y) \end{aligned} y22f=f(x,y+1)f(x,y)(f(x,y)f(x,y1))=f(x,y+1)+f(x,y1)2f(x,y)
    上面两式相加得到结果:
    ▽ 2 f = f ( x + 1 , y ) + f ( x − 1 , y ) − 2 f ( x , y ) + f ( x , y + 1 ) + f ( x , y − 1 ) − 2 f ( x , y ) = ( f ( x + 1 , y ) + f ( x − 1 , y ) + f ( x , y + 1 ) + f ( x , y − 1 ) ) − 4 f ( x , y ) \begin{aligned} \bigtriangledown^2 f &= f(x+1,y) + f(x-1,y) - 2f(x,y) + f(x,y+1) + f(x,y-1) - 2f(x,y) \\ &= (f(x+1,y) + f(x-1,y) + f(x,y+1) + f(x,y-1)) - 4f(x,y) \end{aligned} 2f=f(x+1,y)+f(x1,y)2f(x,y)+f(x,y+1)+f(x,y1)2f(x,y)=(f(x+1,y)+f(x1,y)+f(x,y+1)+f(x,y1))4f(x,y)

写成矩阵形式:
I ′ ′ ( x i , y i ) = [ 0 1 0 1 − 4 1 0 1 0 ] ∗ [ I ( x i − 1 , y i − 1 ) I ( x i , y i − 1 ) I ( x i + 1 , y i − 1 ) I ( x i − 1 , y i ) I ( x i , y i ) I ( x i + 1 , y i ) I ( x i − 1 , y i + 1 ) I ( x i , y i + 1 ) I ( x i + 1 , y i + 1 ) ] \mathrm{I}^{\prime \prime}\left(\mathrm{x}_{\mathrm{i}}, \mathrm{y}_{\mathrm{i}}\right)=\left[\begin{array}{ccc}0 & 1 & 0 \\1 & -4 & 1 \\0 & 1 & 0\end{array}\right] *\left[\begin{array}{ccc}\mathrm{I}\left(\mathrm{x}_{\mathrm{i}-1}, \mathrm{y}_{\mathrm{i}-1}\right) & \mathrm{I}\left(\mathrm{x}_{\mathrm{i}}, \mathrm{y}_{\mathrm{i}-1}\right) & \mathrm{I}\left(\mathrm{x}_{\mathrm{i}+1}, \mathrm{y}_{\mathrm{i}-1}\right) \\\mathrm{I}\left(\mathrm{x}_{\mathrm{i}-1}, \mathrm{y}_{\mathrm{i}}\right) & \mathrm{I}\left(\mathrm{x}_{\mathrm{i}}, \mathrm{y}_{\mathrm{i}}\right) & \mathrm{I}\left(\mathrm{x}_{\mathrm{i}+1}, \mathrm{y}_{\mathrm{i}}\right) \\\mathrm{I}\left(\mathrm{x}_{\mathrm{i}-1}, \mathrm{y}_{\mathrm{i}+1}\right) & \mathrm{I}\left(\mathrm{x}_{\mathrm{i}}, \mathrm{y}_{\mathrm{i}+1}\right) & \mathrm{I}\left(\mathrm{x}_{\mathrm{i}+1}, \mathrm{y}_{\mathrm{i}+1}\right)\end{array}\right] I′′(xi,yi)= 010141010 I(xi1,yi1)I(xi1,yi)I(xi1,yi+1)I(xi,yi1)I(xi,yi)I(xi,yi+1)I(xi+1,yi1)I(xi+1,yi)I(xi+1,yi+1)

  • 效果:拉普拉斯算子处理渐变图的能力要强于Sobel算子
cv2.Laplacian(src, ddepth:cv2.CV_[, dst[, ksize:int[, scale[, delta[, borderType]]]]]) -> dst

高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理

4. Canny边缘检测

4.1 算法流程

4.1.2 图像降噪

图像降噪主要采用高斯滤波方式对图像进行降噪,公式描述如下,
I g = G ∗ I I_g = G * I Ig=GI
其中, I g I_g Ig表示高斯滤波后的像素值, G G G表示高斯滤波卷积核, I I I表示原像素。

4.1.3 计算梯度
  1. 利用Sobel算子,计算x, y方向的梯度:
    I s x = G x ∗ I g I s y = G y ∗ I g I_{sx} = G_x * I_g \\ I_{sy} = G_y * I_g Isx=GxIgIsy=GyIg
  2. 计算每个像素的梯度强度:
    I s = I s x 2 + I s y 2 ≈ ∣ I s x ∣ + ∣ I s y ∣ I_s = \sqrt{I_{sx}^2 + I_{sy}^2} \approx \left\lvert {I_{sx}} \right\rvert + \left\lvert {I_{sy}} \right\rvert Is=Isx2+Isy2 Isx+Isy
  3. 计算每个像素的梯度方向:
    θ = a r c t a n ( I s y I s x ) \theta = arctan(\frac{I_{sy}}{I_{sx}}) θ=arctan(IsxIsy)
4.1.4 非极大值抑制

得到的每个像素强度的非局部最大值就全部舍弃掉,进行边缘预选。
有两种方法:

  • 线性插值法: 对比 I s I_s Is I 1 、 I 2 I_1、I_2 I1I2的值,若 I s I_s Is最大,则保留作为边界,否则则舍弃掉。
    高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理
    I_1,I_2的计算如下:
    高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理
  • 角度近似法: 将中心点周围的像素分为8个方向如下图,刚好每个方向对应的点都是非亚像素点,已知其对应的梯度强度,看中心点的梯度方向 θ \theta θ离哪个方向近就用哪个像素点强度作对比,若中心点大就保留。
    高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理
4.1.5 双阈值检测

用来确定最终的边缘。
高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理
梯度>maxVal:认为是边界像素
梯度<minVal :认为绝对不是边界
梯度介于两者之间判断是否和边界连着,若连着则保留,例如C保留,B舍弃。

判断是否连接会用到DFS或BFS的图的搜索遍历算法,只要周围点中有强边界像素则判其为连接。

4.2 OpecvCV代码

#  threshold1:minVal
# threshold2:maxVal
cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]) -> edges

高斯低通滤波,数字图像处理及OpenCV,计算机视觉,opencv,图像处理

总结

本章主要讲解了卷积操作的基本知识以及低通滤波和高通滤波,低通滤波就是为了消除图像的噪声,但也会让图像变的模糊;高通滤波能够检测图像的边缘,从而进行其他的判断。文章来源地址https://www.toymoban.com/news/detail-742650.html

到了这里,关于第三章 图像的低通与高通滤波的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【计算机视觉】图像分割与特征提取——频域增强(低通滤波&高通滤波)

    个人简介:  📦个人主页:赵四司机 🏆学习方向:JAVA后端开发  ⏰往期文章:SpringBoot项目整合微信支付 🔔博主推荐网站:牛客网 刷题|面试|找工作神器 📣种一棵树最好的时间是十年前,其次是现在! 💖喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。 前言:

    2024年01月15日
    浏览(50)
  • matalb 图像处理 低通滤波和高通滤波 (理想,巴特沃斯,高斯 含代码)

    1.低通滤波 主要分为理想低通滤波,巴特沃斯低通滤波,高斯低通滤波 理想低通滤波: 其中:对于大小为M*N的图像,频率点(u,v)与频域中心的距离为D(u,v),其表达式为: 下列的D(u,v)都相同 巴特沃斯低通滤波: 高斯低通滤波: 2.高通滤波 理想高通滤波: 巴特沃斯高通滤波

    2024年02月08日
    浏览(36)
  • 第三章 灰度变换与空间滤波

    3.1背景知识 ​ 空间域指图像平面本身。变换域的图像处理首先把一幅图像变换到变换域,在变换域中进行处理,然后通过反变换把处理结果返回到空间域。空间域处理主要分为灰度变换与空间滤波。 3.1.1 灰度变换和空间滤波基础 ​ g(x,y) = T[f(x,y)] ​ 其中f(x,y)是输入图像,

    2024年02月03日
    浏览(39)
  • OpenCV(图像处理)-基于Oython-滤波器(低通、高通滤波器的使用方法)

    低通滤波 :低通滤波可以去除图像的噪音或平滑图像。 高通滤波 :可以帮助查找图像的边缘。 噪音 :即对一幅图像的产生负面效果,过暗或过亮的部分,一幅图像中,低于或高于某个像素点的值,都可以认为是噪音。 卷积核 :即用来滤波的矩阵,卷积核一般为奇数,如

    2024年02月09日
    浏览(53)
  • OpenCV(图像处理)-基于python-滤波器(低通、高通滤波器的使用方法)

    低通滤波 :低通滤波可以去除图像的噪音或平滑图像。 高通滤波 :可以帮助查找图像的边缘。 噪音 :即对一幅图像的产生负面效果,过暗或过亮的部分,一幅图像中,低于或高于某个像素点的值,都可以认为是噪音。 卷积核 :即用来滤波的矩阵,卷积核一般为奇数,如

    2024年02月09日
    浏览(62)
  • Matlab图像处理频域滤波实现——巴特沃斯低通、高通、带通带阻滤波器

    巴特沃斯滤波器是一种常用于图像处理的滤波器,它在频域中的传递函数具有更加平滑的过渡,相对于理想滤波器来说,巴特沃斯滤波器可以更好地控制截止频率和滤波器的阶数。下面是巴特沃斯滤波器的不同类型的原理简介: 1.原理 (1)巴特沃斯低通滤波(Butterworth Lowp

    2024年04月09日
    浏览(53)
  • 跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

    摘要: 本文讲解基于傅里叶变换的高通滤波和低通滤波。 本文分享自华为云社区《[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波》,作者:eastmount 。 傅里叶变换的目的并不是为了观察图像的频率分布(至少不是最终目的),更多情况下是为了对频率进行过滤,

    2024年02月04日
    浏览(51)
  • (数字图像处理MATLAB+Python)第三章图像基本运算-第二节:图像代数运算

    A:概述 加法运算 :指将两幅同大小的图像进行像素级别的加法操作,得到一幅新的图像。设两幅图像对应的像素值分别为 f 1 ( x , y ) f_{1}(x,y) f 1 ​ ( x , y ) 和 f 2 ( x , y ) f_{2}(x,y) f 2 ​ ( x , y ) ,则它们的加法运算可表示为 g ( x , y ) = f 1 ( x , y ) + f 2 ( x , y ) g(x,y)=f_{1}(x,y) + f_{

    2023年04月12日
    浏览(57)
  • 【遥感数字图像处理(朱文泉)】第三章 空间域处理方法

     一、空间域与变换域  二、常见数字图像空间域处理方法   - 空间域处理方法是根据图像像元数据的空间表示f(x, y)进行处理;   - 变换域处理方法是对图像像元数据的空间表示f(x, y)先进行某种变换,然后针对变换数据进行处理,最后再把处理的结果反变换到空间域。 注

    2024年01月21日
    浏览(53)
  • 第三章:DeepLabV3——重新思考用于语义图像分割的扩张卷积

    原问题目:《Rethinking Atrous Convolution for Semantic Image Segmentation》 原文引用:Chen L C, Papandreou G, Schroff F, et al. Rethinking atrous convolution for semantic image segmentation[J]. arXiv preprint arXiv:1706.05587, 2017. 发表时间:2018年1月 原文链接: https://arxiv.org/pdf/1706.05587.pdf%EF%BC%8C%E6%8E%A8%E8%8D%90%E5%9C%A8

    2024年02月16日
    浏览(56)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包