CNN中的一些filters

发布时间 2023-10-10 11:02:26作者: 未被占用昵称

Median filter**

中值滤波法是一种非线性平滑技术。它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。常用来处理椒盐噪声(椒盐噪声,又称脉冲噪声,它随机改变一些像素值,在二值图像上表现为使一些像素点变白,一些像素点变黑),主要是利用中值不受分布序列极大值和极小值影响的特点。如下图【图1】为椒盐噪声待处理图像,【图2】为经过3*3中值滤波的处理效果,【图4】为经过均值滤波的处理效果。

当使用中值滤波处理图像时,图像边缘可能会受到污染,即边缘变模糊。尤其是当处理的邻域范围变大时,这种模糊将更明显。如【图3】为经过11*11的中值滤波器处理的效果,可明显看出边缘模糊,甚至于人物下巴处的痣消失。

 

盒式滤波器Box Filter

其主要功能是:在给定的滑动窗口大小下,对每一个窗口内的像素值进行快速相加求和算法

在模式识别领域,Haar特征是你们很是熟悉的一种图像特征了,它能够应用于许多目标检测的算法中。与Haar类似,图像的局部矩形内像素的和、平方和、均值、方差等特征也能够用相似Haar特征的计算方法来计算。这些特征有时会频繁的在某些算法中使用,所以对它的优化势在必行。Boxfilter就是这样一种优化方法,它可使复杂度为O(MN)的求和,求方差等运算下降到O(1)或近似于O(1)的复杂度,它的缺点是不支持多尺度。

第一个提出Haar特征快速计算方法的是CVPR2001上的那篇经典论文Rapid Object Detection using a Boosted Cascade of Simple Features ,它提出了integral image的概念,这个方法使得图像的局部矩形求和运算的复杂度从O(MN)降低到了O(4)。它的原理很简单:首先创建一个数组A,宽高与原图像相等,而后对这个数组赋值,每一个元素的值A[i]赋为该点与图像原点所构成的矩形中全部像素的和。初始化以后,想要计算某个矩形像素和的时候能够采用以下方法:如图D矩形的像素和就等于A[4] – A[2] – A[3] + A[1],共4次运算,即O(4)。Integral Image极大的提升了Haar特征的计算速度,它的优势在于可以快速计算任意大小的矩形求和运算。数组

  Boxfilter的原理有点相似Integral Image,并且比它还要快,可是实现步骤比较复杂。在计算矩形特征以前,Boxfilter与Integral Image都须要对图像进行初始化(即对数组A赋值),不一样于Integral Image, Boxfilter的数组A中的每一个元素的值是该像素邻域内的像素和(或像素平方和),在须要求某个矩形内像素和的时候,直接访问数组中对应的位置就能够了。所以能够看出它的复杂度是O(1)。

 

Boxfilter的初始化过程以下:

一、给定一张图像,宽高为(M,N),肯定待求矩形模板的宽高(m,n),如图紫色矩形。图中每一个黑色方块表明一个像素,红色方块是假想像素。code

二、开辟一段大小为M的数组,记为buff, 用来存储计算过程的中间变量,用红色方块表示blog

三、将矩形模板(紫色)从左上角(0,0)开始,逐像素向右滑动,到达行末时,矩形移动到下一行的开头(0,1),如此反复,每移动到一个新位置时,计算矩形内的像素和,保存在数组A中。以(0,0)位置为例进行说明:首先将绿色矩形内的每一列像素求和,结果放在buff内(红色方块),再对蓝色矩形内的像素求和,结果即为紫色特征矩形内的像素和,把它存放到数组A中,如此便完成了第一次求和运算。it

四、每次紫色矩形向右移动时,实际上就是求对应的蓝色矩形的像素和,此时只要把上一次的求和结果减去蓝色矩形内的第一个红色块,再加上它右面的一个红色块,就是当前位置的和了,用公式表示 sum[i] = sum[i-1] - buff[x-1] + buff[x+m-1]

五、当紫色矩形移动到行末时,须要对buff进行更新。由于整个绿色矩形下移了一个像素,因此对于每一个buff[i], 须要加上一个新进来的像素,再减去一个出去的像素,而后便开始新的一行的计算了。opencv

  Boxfilter的初始化过程很是快速,每一个矩形的计算基本上只须要一加一减两次运算。从初始化的计算速度上来讲,Boxfilter比Integral Image要快一些,大约25%。在具体求某个矩形特征时,Boxfilter比Integral Image快4倍,所谓的4倍其实就是从4次加减运算下降到1次,虽然这个优化很是眇小,可是把它放到几层大循环里面,仍是能节省一些时间的。对于那些实时跟踪检测算法,一帧的处理时间要严格在40ms如下,正是这些细小的优化决定了程序的效率,聚沙成塔,积少成多。

# gaussian_filter( )函数(高斯滤波)

对一个数进行高斯滤波(模糊)可以理解成将该数取附近矩形窗口所有值的加权平均值,距离处理数越近的点权重越大,距离处理点越远的点权重越小。因此如果取的矩形窗口越大,那么对处理点的模糊效果越强烈。

 


上图,对数值2进行高斯滤波(模糊),取该数附近3×3阶矩形窗口(左图)。如果待处理点2直接取周围点的平均值,就会变成1(右图)。在数值上,这是一种平滑化,在图形上,就相当于产生模糊效果,让中间点失去细节。

因为数值和图像都是连续的,越靠近待处理点的点关系越密切,越远离待处理点的点关系越疏远,像上图那样直接使用简单平均是不合理的。用加权平均更合理,即距离越近的点权重越大,距离越远的点权重越小。之所以把这种滤波方式叫做高斯滤波,是因为权重值是由高斯函数决定。

 

一维高斯分布函数: 

 

二维高斯分布函数:

 

1 一维高斯滤波 存在如下一组数据,现对4进行高斯滤波,选取4附近的1×3矩形窗口,即[3 4 2]进行加权求和。

$$[3 4 2 5 8 1 6]$$ 假定4的坐标是0,那么它附近的矩形窗口的坐标是[-1 0 1]。 一维高斯分布函数可以决定一维数据周围点的权重值,假设=1,分别将坐标代入一维高斯分布函数得到权值矩阵[0.2419 0.3989 0.2419],这3个点的权值总和等于0.8827,如果要计算这3个点的加权平均,必须让他们的权重之和=1,因此权值矩阵还要分别除以0.8827,得到最终的权重矩阵[0.2740 0.4519 0.2740]。将每个点乘以对应的权值,将所有值相加(0.822+1.8076+0.548=3.1776)就是待处理值4的高斯模糊值。像4一样,对3 4 2 5 8 1 6每个数据都进行这样的操作,就是对这个数据进行了高斯滤波。

需要注意的是开头3和结尾6,要么不进行高斯滤波(常用),要么补零。

python中,一维高斯滤波器的函数:

gaussian_filter1d(input, sigma) input:输入一维数据;sigma: 高斯函数里面的σ,σ越大滤波越厉害(因为σ表示高斯分布的集中度,越大越不集中);返回一个和input形状一样的数据。

2 二维高斯滤波 现对下图一中的4进行高斯滤波,选取4附近的3×3矩形窗口,对[[14 15 16],[24 25 26],[34 35 36]]进行加权求和。假定25的坐标是(0,0),那么它附近的矩形窗口的坐标是[[(-1,1) (0,1) (1,1)],[(-1,0) (0,0) (1,0)],[(-1,-1) (0,-1) (1,-1)]]。 二维高斯分布函数可以决定二维数据周围点的权重值,假设σ=1.5,分别将坐标代入一维高斯分布函数得到权值矩阵(图二),9个点的权值总和等于0.4787147,如果要计算这9个点加权平均,必须让他们的权重之和=1,故权值矩阵还要分别除以0.4787147,得到最终的权重矩阵(图三)。将每个点乘以对应的权值(图四),将所有值相加(24.9999)就是待处理值25的高斯模糊值。

 

python中,多维高斯滤波器的函数:

gaussian_filter(input, sigma) input:输入矩阵;sigma: 高斯函数里面的,越大滤波越厉害;返回一个和input形状一样的数据。

双边滤波(Bilateral Filter)

原理分析: 双边滤波与高斯滤波器相比,对于图像的边缘信息能过更好的保存。其原理为一个与空间距离相关的高斯函数与一个灰度距离相关的高斯函数相乘。

     空间距离:指的是当前点与中心点的欧式距离。空间域高斯函数其数学形式为:

 

其中(xi,yi)为当前点位置,(xc,yc)为中心点的位置,sigma为空间域标准差。

     灰度距离:指的是当前点灰度与中心点灰度的差的绝对值。值域高斯函数其数学形式为:

 

其中gray(xi,yi)为当前点灰度值,gray(xc,yc)为中心点灰度值,sigma为值域标准差。

     对于高斯滤波,仅用空间距离的权值系数核与图像卷积后,确定中心点的灰度值。即认为离中心点越近的点,其权重系数越大。

     双边滤波中加入了对灰度信息的权重,即在邻域内,灰度值越接近中心点灰度值的点的权重更大,灰度值相差大的点权重越小。此权重大小,则由值域高斯函数确定。

     两者权重系数相乘,得到最终的卷积模板。由于双边滤波需要每个中心点邻域的灰度信息来确定其系数,所以其速度与比一般的滤波慢很多,而且计算量增长速度为核大小的平方。

 

参数选择: 空间域sigma选取:其中核大小通常为sigma的6sigma + 1。因为离中心点3sigma大小之外的系数与中点的系数只比非常小,可以认为此之外的点与中心点没有任何联系,及权重系数为0.OpenCV中默认的计算公式也是如此,OpenCV参考文档内容如下:“对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算: sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核,n=param2对应垂直核.”

     值域sigma选取:另灰度差△g  =  abs(gray(xi,yi)- gray(xc,yc)),忽略常数的影响,因此其函数可以简化为:

 

 

的图像可知:

 

已知 0≤△g≤255;

1)假设sigma = 255,当△g = 255时,系数为exp(-1) = 0.3679,当△g = 0时,系数为exp(-0)= 1.灰度最大点的系数与相差最小的灰度值系数之比为 0.3679.

2)假设sigma = 122.5,当△g = 255时,系数为exp(-4) = 0.0183,当△g = 0时,系数为exp(-0)= 1.灰度差最大点的系数与相差最小的灰度值系数之比为 0.0183.

结论:因为导数为,其增长速度为指数增长。

当simga较大时,灰度差最大值与最小值的系数在很小的一个范围之内,其比值较大。及灰度差较大的点,对于中心点也会有相应的较大的权值,此与双边滤波的保留边缘的初衷相违背。

当sigma较小时,灰度差最大值与最小值的系数在较大的一个范围之内,其比值很小,及灰度差较大的点,对应中心点仅有很小的权重。

综上分析可知:

Sigma越大,边缘越模糊,极限情况为simga无穷大,值域系数近似相等(忽略常数时,将近为exp(0)= 1),与高斯模板(空间域模板)相乘后可认为等效于高斯滤波。

Sigma越小,边缘越清晰,极限情况为simga无限接近0,值域系数近似相等(接近exp(-∞) = 0),与高斯模板(空间域模板)相乘后,可近似为系数皆相等,等效于源图像。

拉普拉斯滤波器(Laplace filter)

一、拉普拉斯算子 拉普拉斯算子定义

 

二、拉普拉斯作用 由于拉普拉斯是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。 因此,锐化处理可选择拉普拉斯算子对原图像进行处理,产生描述灰度突变的图像,再将拉普拉斯图像与原始图像叠加而产生锐化图像

这种简单的锐化方法既可以产生拉普拉斯锐化处理的效果,同时又能保留背景信息,将原始图像叠加到拉普拉斯变换的处理结果中去,可以使图像中的各灰度值得到保留,使灰度突变处的对比度得到增强,最终结果是在保留图像背景的前提下,突现出图像中小的细节信息

注意:这里所提的叠加,需要根据模板中心系数来确定加或减

三、示例 原图 Figure 1 ,一幅略显模糊的月球北极图像

 

对图像增强操作是 锐化图像,同时尽可能地保留其灰度色调

% 生成并显示一个拉普拉斯滤波器

w = fspecial('laplacian',0) w = 0 1 0 1 -4 1 0 1 0 % 手工指定其形状 wp = [0 1 0;1 -4 1;0 1 0]; % 将 w 应用到输入图像 f 中 g1 = imfilter(f,w,'replicate'); figure,imshow(g1,[])

 

==结果图像所有的像素都是正的,由于滤波器的中心系数为负,所以希望得到一个带负值的拉普拉斯图像,由于 f 是 uint8 类图像,所以使用 imfilter 滤波后的输出图像与输入图像时同类图像,所以负值将被截掉。==

==可以在滤波前将 f 转换为 double 类图像来解决这一问题==


f2 = im2double(f); g2 = imfilter(f2,w,'replicate'); figure,imshow(g2,[]) % 得到拉普拉斯图像的典型外观 Figure 3 % 最后从原图中减去用拉普拉斯算子处理过的结果,以还原失去的灰度色调 % 因为中心系数为负值,所以 公式中 c 为负值,即减 g = f2 - g2; figure,imshow(g)

 

Sobel Filter

Sobel Filter是一个相当简单的边缘查找算法,他能检测比较锐利的边缘(模糊的图片或不锐利的边缘无法有效检测,请搜索Canny Filter算法)

方法是获得当前点以及周围点的权重来描述当前点位置上的边缘强度(颜色变化速度)

横向边缘检测Mx

 

紫色像素的周围九宫格与横向检测矩阵dot得到一个值,这个值的大小就是边缘颜色变化率,当两侧颜色相同或相近时,你可以看到这个值趋近于0. 整体图视作Gx

 

同样方法可以检测纵向的颜色变化,这样可以得到一张图片的两个不同方向的灰度变化图Gx和Gy

 

如何混合两个不同方向上的边缘强度变化?

 

答案是两个方向的平方和开方 强度为 G = (GxGx+GyGy)^0.5; 方向为 R = atan(Gy/Gx);

 

unsharp masking

数字图像处理中图像增强算法中常用的两种技术:非锐化掩蔽和高提升滤波

  非锐化掩蔽:

  顾名思义即减去平滑后的图像,其原理流程图如下:

1、平滑原图像:f->s;

2、从原图像中减去模糊图像,产生的差值图像称为模板:m=f-s;

3、将模板加到原图像中:

 

 

 

特点:1、系数k越大对细节增强越明显;

           2、平滑减弱的边缘,锐化后增强的更加明显



高提升滤波:
一般锐化模板其系数之和均为0,这说明算子在灰度恒定区域的响应为0,即在锐化处理后的图像中,原图像的平滑区域近乎黑色,而原图中所有的边缘、细节和灰度跳变点都作为黑背景中的高灰度部分突出显示。基于锐化的图像增强中存储希望在增强边缘和细节的同时仍然保留原图像中的信息,而非将平滑区域的灰度信息丢失,因此可以把原图像加上锐化后的图像得到比较理想的结果。

其原理流程图如下:

1、图像锐化

2、原图像与锐化图像按比例混合

3、混合后的灰度调整(归一化至[0,255])

 


下面的是MRI Reconstruction with Interpretable Pixel-Wise Operations Using Reinforcement Learning未用到的滤波器

最小值与最大值滤波(如,椒盐噪声)

 

 

 

最大值滤波器

 

最小值滤波器

 

均值滤波器

引导滤波 与双边滤波最大的相似之处,就是同样具有保持边缘特性。在引导滤波的定义中,用到了局部线性模型。 该模型认为,某函数上一点与其邻近部分的点成线性关系,一个复杂的函数就可以用很多局部的线性函数来表示,当需要求该函数上某一点的值时,只需计算所有包含该点的线性函数的值并做平均即可。这种模型,在表示非解析函数上,非常有用。 

 

在滤波效果上,引导滤波和双边滤波差不多,在一些细节上,引导滤波较好。 引导滤波最大的优势在于,可以写出 时间复杂度 与窗口大小无关的算法,因此在使用大窗口处理图片时,其效率更高。


差分滤波器

差分滤波器对图像亮度急剧变化的边缘有提取效果,可以获得邻接像素的差值。

 

纵向:在滤波器中,取范围内中心点的值和上方的值,两者之差填入中心点

横向:在滤波器中,取范围内中心点的值和左方的值,两者之差填入中心点

注意:有可能用较大值减去较小值。比如:180-181 = -1,由于数据类型是uint8,自动变成255,所以要取相减之后的绝对值。