首页 > 其他分享 >图像的线性滤波/卷积

图像的线性滤波/卷积

时间:2024-04-03 16:31:43浏览次数:22  
标签:Sobel 卷积 cv2 滤波 像素 图像 线性

效果

sobel

  • 左上为y方向滤波,右上为x方向滤波,下图为两种滤波的叠加

原理部分

线性滤波可以说是图像处理最基本的方法,它允许我们对图像进行处理,产生很多不同的效果。
在这里插入图片描述

卷积

卷积的数学定义:
卷积公式
一般称g为作用在f上的filter或kernel

对于滤波器,也有一定的规则要求:

  • 滤波器的大小应该是奇数,这样它才有一个中心,例如3x3,5x5或者7x7。有中心了,也有了半径的称呼,例如5x5大小的核的半径就是2。
  • 滤波器矩阵所有的元素之和应该要等于1,这是为了保证滤波前后图像的亮度保持不变。但这不是硬性要求。
  • 如果滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为0,图像不会变黑,但也会非常暗。
  • 对于滤波后的结构,可能会出现负数或者大于255的数值。对这种情况,我们将他们直接截断到0和255之间即可。对于负数,也可以取绝对值。只针对图像。

在具体应用中,往往有多个卷积核,可以认为,每个卷积核代表了一种图像模式。如果某个图像块与此卷积核卷积出的值大,则认为此图像块十分接近于卷积核。

  • 例如,如果我们设计了6个卷积核,可以理解:我们认为这个图像上有6种底层纹理模式,也就是我们永6种基础模式就能描绘出一幅图像。

  • 用Gx或Gy来卷积下面这张图的话,就会在中间黑白边界获得比较大的值。
    在这里插入图片描述
    在非边界部分,得到结果为0(黑色),在边界部分,得到结果取绝对值并截断为255(白色)

卷积的应用——一个没有任何效果的卷积
  • 将原像素中间像素值乘1,其余全部乘0。
    显然像素值不会发生任何变化。
    在这里插入图片描述
平滑均值滤波
  • 取九个值的平均值代替中间像素值,起到平滑的效果。
    平滑均值滤波
高斯平滑
  • 高斯平滑水平和垂直方向呈现高斯分布,更突出了中心点在像素平滑后的权重,相比于均值滤波而言,有着更好的平滑效果。
    高斯平滑
图像锐化
  • 图像锐化使用的是拉普拉斯变换核函数
    图像锐化
Sobel边缘检测
  • Sobel更强调了和边缘相邻的像素点对边缘的影响。
    Sobel边缘检测
卷积解决的问题
  • 卷积负责提取图像中的局部特征
卷积–步长/Stride

如果用(f, f)的过滤器来卷积一张(h, w)大小的图片,每次移动一个像素的话,那么得出的结果就是(h-f+1, w-f+1)的输出结果。f是过滤器大小,h和w分别是图片的高宽。
如果每次不止移动一个像素,而是s个像素,那么结果就会变为:
在这里插入图片描述
这个s就叫做步长

存在的问题:

  • 只要是f或s的值比1要大的话,那么每次卷积之后结果的长款,要比卷积之前小一些
  • 丢失信息

因此,我们可以在外围补上一圈值为0的像素

padding
有了填充之后,每次卷积之后的图像大小:
在这里插入图片描述
p表示填充的padding圈数,每填充一圈长/宽增加2
此时如果想让高(宽)不变(步长为1时):
在这里插入图片描述
计算得到:
在这里插入图片描述

卷积——三种填充模式

橙色部分为image, 蓝色部分为filter。从左往右分别是:full、same、valid模式
三种填充模式
注意:这里的same还有一个意思,卷积之后输出的feature map尺寸保持不变(相对于输入图片)。当然,same模式不代表完全输入输出尺寸一样,也跟卷积核的步长有关系。same模式也是最常见的模式,因为这种模式可以在卷积过程中让图的大小保持不变。

多通道卷积

在这里插入图片描述

  • 蓝色部分表示原图的三个通道映射图片
  • 红色的两列W0, W1表示对应着两种特征提取。因为这里图像分解为三通道,所以每个特征提取还要再细分为对三个通道的不同卷积
  • 对于一个特征提取(如W0),计算方式为,将三个通道的卷积分别计算后累加,得到Output。绿色部分的两幅图则分别对应W0列,W1列的三个通道卷积累加的计算结果
  • 注意:上述例子的卷积计算中的步长stride = 2
卷积核的确定

CNN厉害的地方在于,过滤器的特征并不是人为设定的,而是通过大量图片自己训练出来的

代码部分(以Sobel边缘检测为例)

"""
@author: Hanley-Yang

sobel:边缘检测
"""

import cv2
from matplotlib import pyplot as plt

'''
Sobel函数求完导数后会有负值,还有会大于255的值。
而原图像是uint8,即8位无符号数(范围在[0,255]),所以Sobel建立的图像位数不够,会有截断。
因此要使用16位有符号的数据类型,即cv2.CV_16S
'''
img = cv2.imread('Euphonium.png')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

x = cv2.Sobel(img_gray, cv2.CV_16S, 1, 0)
y = cv2.Sobel(img_gray, cv2.CV_16S, 0, 1)

'''
在经过处理后,别忘了用convertScaleAbs()函数将其转回原来的uint8形式。
否则将无法显示图像,而只是一副灰色的窗口。
dst = cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])  
其中可选参数alpha是伸缩系数,beta是加到结果上的一个值。结果返回uint8类型的图片。
'''

absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)

'''
由于Sobel算子是在两个方向计算的,最后还需要用cv2.addWeighted(...)函数将其组合起来
。其函数原型为:
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])  
其中alpha是第一幅图片中元素的权重,beta是第二个的权重,
gamma是加到最后结果上的一个值。
'''
dst = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)

rgb_absX = cv2.cvtColor(absX, cv2.COLOR_BGR2RGB)
rgb_absY = cv2.cvtColor(absY, cv2.COLOR_BGR2RGB)
rgb_dst = cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)

plt.subplot(221)
plt.imshow(rgb_absX)

plt.subplot(222)
plt.imshow(rgb_absY)

plt.subplot(223)
plt.imshow(rgb_dst)

plt.show()

  • 输出结果
    在这里插入图片描述
    左上为y方向滤波,右上为x方向滤波,下图为两种滤波的叠加

标签:Sobel,卷积,cv2,滤波,像素,图像,线性
From: https://blog.csdn.net/Yophan/article/details/137346811

相关文章

  • 嵌入式算法开发系列之卡尔曼滤波算法
    卡尔曼滤波算法文章目录卡尔曼滤波算法前言一、卡尔曼滤波算法原理二、算法应用三、C语言实现总结前言在嵌入式系统中,传感器数据通常受到噪声、误差和不确定性的影响,因此需要一种有效的方法来估计系统的状态。卡尔曼滤波算法是一种基于概率理论的优雅而高效的状态......
  • 深度学习-卷积神经网络--MT CNN-人脸检测-推理-65
    目录参考链接:https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/104980479?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171211076616800222824039%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171211076616800222824......
  • 深度学习-卷积神经网络--MT CNN-人脸检测-64
    目录1.MTCNN-的原理2.损失函数4.升华Paper地址:https://kpzhang93.github.io/MTCNN_face_detection_alignment/github链接:https://github.com/kpzhang93/MTCNN_face_detection_alignment1.MTCNN-的原理图像金字塔对图片进行Resize操作,将原始图像缩放成不同的尺度,生......
  • B82793S0513N201 共模扼流圈滤波器电感 51uH 800mA
    B82793S0513N201是一款由TDK(东电化)公司生产的数据线扼流圈,用于电信领域的xDSL变压器。制造商:TDK产品品种:共模扼流圈/滤波器RoHS:详细信息系列:B82793S安装风格:PCBMount端接类型:SMD/SMT通道数量:1Channel电感:51uH容差:30%最大直流电流:800mA最......
  • 动态规划---线性dp1
    7-3最大子序列总和给定K个整数序列{N1,N2,...,NK}。连续子序列定义为{Ni,Ni+1,...,Nj},其中1≤i≤j≤K。最大子序列是具有最大元素总和的连续子序列。例如,给定序列{-2,11,-4,13,-5,-2},其最大子序列为{11,-4,13},最大和为20。现在,您应该找到最大的总和,以及......
  • 动态规划-----线性
    [TJOI2007]线段(洛谷P3842)题目描述在一个\(n\timesn\)的平面上,在每一行中有一条线段,第\(i\)行的线段的左端点是\((i,L_{i})\),右端点是\((i,R_{i})\)。你从\((1,1)\)点出发,要求沿途走过所有的线段,最终到达\((n,n)\)点,且所走的路程长度要尽量短。更具体一些说,你在任......
  • 几种嵌入式中常见的滤波算法
    在嵌入式系统开发中,滤波算法是不可或缺的一部分,用于从带有噪声的数据中提取有用信息,提高数据质量,并减少错误决策的可能性。下面将介绍几种在嵌入式系统中常见的滤波算法。1.移动平均滤波(MovingAverageFilter)移动平均滤波是一种简单的滤波算法,通过计算一定窗口内数据点的平......
  • 【机器学习300问】61、逻辑回归与线性回归的异同?
        本文讲述两个经典机器学习逻辑回归(LogisticRegression)和线性回归(LinearRegression)算法的异同,有助于我们在面对实际问题时更好的进行模型选择。也能帮助我们加深对两者的理解,掌握这两类基础模型有助于进一步理解更复杂的模型结构,例如逻辑回归是许多复杂分类算法的......
  • 用梯度下降法实现线性回归
    sklearn的SGDRegressor()函数用于实现梯度下降法的回归分析。#coding=utf-8#导入必要的库importnumpyasnpimportmatplotlib.pyplotaspltfromsklearnimportlinear_model#设置文字plt.rcParams['font.sans-serif']='SimHei'#创建数据矩阵X,y=[],[......
  • 机器学习——卷积神经网络中的其他类型
    机器学习——卷积神经网络中的其他类型卷积神经网络(ConvolutionalNeuralNetworks,CNNs)是深度学习领域中最重要的技术之一,它在图像处理、语音识别、自然语言处理等领域取得了巨大成功。在CNN中,卷积层是最核心的组成部分之一,而卷积操作又有许多不同类型,本文将重点介绍其中......