精华内容
下载资源
问答
  • 模糊
    千次阅读 多人点赞
    2021-02-24 19:44:34

    Introduction

    图像去模糊是一个经典的图像复原任务。造成图像模糊的原因有很多,可以主要分为三大类

    • 离焦模糊:场景中的物体处于成像景深范围之外而变得模糊。离焦模糊的去除一般对应着景深的扩展技术
    • 像差模糊:镜头加工和制造的缺陷造成了物方的一个点在成像平面形成了一个弥散斑
    • 运动模糊:成像过程中相机运动或者场景变化所造成的不同空间位置信息的混叠

    而最常见的图像去模糊技术一般都是针对运动模糊的去除,因为运动模糊往往是拍摄者不想引入拍摄图像的。我们本次就简单介绍一下图像运动模糊的形成和去除。

    The formation of motion blur

    正如前面所提到的,图像运动模糊是由于成像过程中相机运动或者场景变化所造成的不同空间位置信息的混叠。拍摄图像时往往需要一定的曝光时间,如果在这一段曝光时间内投射到传感器上的画面运动超过单个像素尺寸,那么模糊就会出现。曝光时间越长,图像中的模糊往往就剧烈。场景点的运动轨迹累计形成的图像即为模糊核,其记录着在曝光时间内,当前场景点在图像上的能量分布和影响范围。

    在考虑去除图像模糊之前,我们首先需要考虑如何描述运动模糊,以及如何对运动模糊进行建模。场景变化如场景中车的行驶或者行人的走动往往是复杂多变的,许多并不是刚体运动可以描述的。而实际上,许多物体运动造成的模糊有可能是摄影者故意为之的,如延时摄影。而对于相机运动造成的图像全局模糊却往往是不想要的。对于这种运动模糊,我们可以通过刚体运动和针孔成像模型来进行建模,得到每个时刻的像素运动状态,从而获知曝光时间内每个像素的模糊核。这里默认大家对相机运动和针孔成像模型有了基本的了解,因而直接给出模型的结论。

    相机经过平移和旋转后,图像上的像素点变化前后的位置 Q 0 ( u 0 . v 0 ) Q_0(u_0.v_0) Q0(u0.v0)以及 Q 1 ( u 1 , v 1 ) Q_1(u_1,v_1) Q1(u1,v1)存在如下关系:
    [ u 1 v 1 1 ] = Z 0 Z 1 K R ( θ ) K − 1 [ u 0 v 0 1 ] + K T ⃗ Z 1 \left[ \begin{array}{c} u_1 \\ v_1 \\ 1\\ \end{array} \right] = \frac{Z_0}{Z_1}KR(\theta)K^{-1}\left[ \begin{array}{c} u_0 \\ v_0 \\ 1\\ \end{array} \right] + \frac{K\vec{T}}{Z_1} u1v11=Z1Z0KR(θ)K1u0v01+Z1KT

    其中, Z 0 Z_0 Z0 Z 1 Z_1 Z1分别表示相机在运动前后的物方成像距离。 K K K表示相机内参矩阵,其代表着相机内部的参数,如焦距,主点等; R ( θ ) R(\theta) R(θ)表示旋转矩阵,其代表着相机绕各个轴转过的角度; T ⃗ \vec{T} T 表示平移向量,其代表着相机平移的距离。可以看出,造成场景点在成像平面上像素位置移动的因素包括了相机的运动状态,相机参数以及场景与相机的距离。如果能够精确的记录这几组参数,就可以准确地描述图像中每个像素点的运动状态,从而获知图像的模糊形态。

    在日常的拍摄场景中,成像距离一般比较远(如大于2m),此时相机的移动远远小于场景与相机的距离,即 T ⃗ ≪ Z 0 \vec{T} \ll Z_0 T Z0。而且 Z 0 ≈ Z 1 Z_0\approx Z_1 Z0Z1与物距(场景深度)无关,场景可以近似看做在同一个成像平面上。那么上式可以简化为:
    [ u 1 v 1 1 ] ≈ K R ( θ ) K − 1 [ u 0 v 0 1 ] \left[ \begin{array}{c} u_1 \\ v_1 \\ 1\\ \end{array} \right] \approx KR(\theta)K^{-1}\left[ \begin{array}{c} u_0 \\ v_0 \\ 1\\ \end{array} \right] u1v11KR(θ)K1u0v01

    即可以认为物体的模糊主要来源与相机的旋转运动,且成像过程没有明显的缩放。如果我们对这个模型做进一步简化,认为相机绕Z轴旋转近似为0,那么此时图像模糊可以简化为全局均匀模糊,即模糊形式退化为单一模糊核对图像做全局卷积,也就是传统去模糊中的经典形式:
    y = k ∗ x y=k*x y=kx

    其中, k k k表示模糊核, y y y表示拍摄到的模糊图像, x x x表理想的清晰图像, ∗ * 表示卷积操作。

    Deblurring Method

    曝光时间越长,图像就越有可能出现模糊。因而减小模糊的最直接方式就是缩短曝光时间,比如相机拍照时都有一个安全快门,使用小于安全快门的曝光时间拍摄,可以尽量减少相机抖动造成的模糊。然而,在许多场景下减小曝光时间往往会带来其他问题,如高噪声,偏色等。因而有许多图像复原方法被提出用于解决不同场景下的图像模糊问题。图像去模糊方法有多种分类,比如根据模糊状态是否已知可以分为图像盲去模糊和图像非盲去模糊。根据复原方法的不同,可以分为基于模型的方法(model-based method)和基于学习的方法(learning-based method)。下面将按照这种分类来做依次介绍。

    Model-based Methods

    基于模型的方法就是先对模糊过程进行建模,然后借助于优化方法等数学工具来求解逆过程。正如前面介绍到的,传统去模糊中的经典形式为:
    y = k ∗ x + n y=k*x+n y=kx+n

    其中, n n n表示噪声。我们已知模糊图像 y y y,然后估计原始图像 x x x和模糊核 k k k(盲去模糊),或者已知 y y y k k k从而估计 x x x(非盲去模糊)。逆过程的求解往往是一个病态问题,该问题的解往往不是唯一的。为了缩小问题的解空间,更好的逼近真实解,我们需要添加先验条件。不同的先验条件会引导我们进入不同的解空间,从而得到不同的复原图像。

    在基于模型的方法中,图像去模糊的目标函数是在贝叶斯框架下面使用最大后验概率的方法建立的。
    x , k = arg ⁡ min ⁡ x , k f ( x , y ) + p r i o r ( x ) + p r i o r ( k ) x,k=\arg\min_{x,k} f(x,y)+prior(x)+prior(k) x,k=argx,kminf(x,y)+prior(x)+prior(k)

    其中, f ( x , y ) f(x,y) f(x,y)表示数据保真项,其通过对图像噪声建模,使得估计出的原始图像与退化图像在内容上保持一致。 p r i o r ( x ) prior(x) prior(x) p r i o r ( k ) prior(k) prior(k)则分别表示图像内容的先验项和模糊核的先验项(如果模糊核未知)。去模糊的效果这就主要受这三个方面的影响。许多基于模型的方法都是在这三个方面进行改进。

    然而,基于模型的去模糊方法也有其局限性。首先就是大多数方法都是基于经典的卷积模型,针对的是全局均匀的模糊。对于非全局均匀模糊,如相机绕Z轴旋转造成的图像旋转模糊就很难使用单一模糊核描述。而对于场景中物体运动造成的局部运动模糊更是无能为力。另外,基于模型的方法一般都是采用迭代的方式,利用图像金字塔从小到大地估计模糊核和去除模糊,因而往往需要大量的时间开销。

    Learning-based Methods

    随着深度学习的普及,许多基于学习的图像复原的方法也开始兴起。与图像降噪和超分辨等图像复原任务相比,基于学习方法的图像去模糊兴起得更晚一点,研究也相对较少。对于基于监督学习的图像复原任务,最重要的因素之一就是数据集的构建。图像去模糊的数据集构建方式大体可以分为以下几类:

    • 先获取或生成模糊核,然后使用模糊核卷积图像得到模糊-清晰数据对。这种方式正是使用了前面提到的经典卷积模型来构建全局均匀的模糊,也是最通用的方法之一。而对于基于CNN的去模糊方法,由于其感受野有限,局部图像区域的模糊可以近似看做是均匀模糊,因而尽管在合成数据对时使用单一模糊核卷积图像块,训练得到的模型对于非均匀模糊也有一定的自适应效果。Lai和Kohler等公开的评价测试集中都采用了这种方式。
    • 使用相机运动模型和成像模型仿真运动过程,然后合成全局非均匀模糊。这种方法就是利用了前面提到的相机抖动造成模糊的原理。通过模拟或者获取相机运动状态(如记录相机陀螺仪数据),然后借助于相机参数和成像参数,获取曝光时间内的每个时刻的运动状态进行叠加。利用该方法生成的模糊数据更加接近相机抖动造成的模糊形态。
    • 使用高帧率相机拍摄高帧率图像序列,然后多帧叠加合成。上面两种合成方式只能模拟相机运动造成的模糊,而对于场景中物体运动造成的局部模糊无法模拟。而使用高帧率相机拍摄则可以既引入相机运动模糊,也可以引入物体运动的局部模糊。Nah等人率先使用GoPro运动相机构建了这种数据集,现在这种构建方式也成为去模糊数据集的主流形式之一。
    • 使用分光装置将同一场景分光给两个相机,使得这两个相机同时接受同一个场景画面。其中一个相机采用长曝光拍摄模糊图像,另一个采用短曝光方式采集清晰图像,从而得到模糊-清晰图像对。采用这种方式可以获取更加真实的模糊数据,避免了高帧率相机在合成快速运动物体和高曝光区域的不足。ECCV2020有两篇文章(Rim等人Zhong等人)都采用了这种方式建立模糊数据集。

    在网络模型方面,许多其他图像复原任务如降噪、超分辨等以及高层视觉任务中的网络结构都被借鉴过来。许多传统去模糊的方法也被借鉴到去模糊网络中,比如传统去模糊中使用金字塔结构从小尺度到大尺度地迭代去模糊,而多尺度递归的网络结构(如SRN)也被应用到去模糊任务中并取得了不错的效果。借助于网络模型,去模糊方法可以打破传统卷积模型的限制,使得去模糊算法可以同时应对相机运动造成的全局非均匀模糊和场景中物体运动造成的局部模糊。同时基于学习的方法缩短了运行时间,随着终端算力的提升,使得去模糊方法的落地变成了可能。

    Conclusion

    图像去噪和超分辨等图像复原算法已经在智能终端得到普及并大大提升了拍照质量,而图像去模糊也逐渐成为下一个落地的目标。像如NITRE2020的图像比赛,就将图像去模糊在智能手机中的应用作为一个赛道,并有许多成果呈现出来。由于图像模糊的复杂性,能够在大多数场景中兼顾效果和性能的去模糊算法还有待发掘和改进。如何减小模型的时间和内存开销,如何增强模型的鲁棒性和实用性,如何保留下摄影师想刻意为之的模糊而去掉不想要的模糊,如何在去掉模糊后不引入振铃等伪纹理。图像去模糊的实用化还任重而道远。

    参考文献

    图像去模糊论文集合:[github]

    更多相关内容
  • simulink实现模糊PID.zip

    2020-04-16 23:23:35
    通过simulink实现模糊PID,通过模糊控制实现PID参数Kp、Ki、Kd的整定问题,从而获得比单独PID更好的控制效果。
  • 模糊控制经典教材,王立新-模糊系统与模糊控制教程.pdf
  • 使用MATLAB软件中的simulink模块,进行模糊PID控制仿真,实测成功!!
  • 模糊控制算法,使用c语言写的程序,可以实现模糊算法的功能
  • 模糊控制的simulink仿真程序,简单易懂,可以作为学习参考
  • 模糊控制的MATLAB实现具体过程,通过举例通俗易懂的介绍模糊控制的实现过程
  • 用MATLAB编写的离散模糊控制程序,结合本程序,我相信能能更快更好的理解模糊控制算法。算法在MATLAB Version: 7.14.0.739 (R2012a)运行无误。 function [FCU_T1,FCU_T2,FCU_T3,FCU_T4]=fuzzy_table(Me,Mec,Mu,UC) ...
  • 本文件详细讲述模糊控制在matlab中的应用,其中包含大量实例。
  • 屏幕特效之径向模糊

    热门讨论 2015-09-24 16:34:04
    使用于移动平台的unity径向模糊屏幕特效,效率不错
  • 自写的一个能进行 模糊查询+多选的下拉框(select) 本人亲测,肯定符合你的要求
  • 在easy ui datagrid 列表基础上实现行过滤[行模糊查询],注:数据库远程查询
  • 均值模糊1.什么是均值模糊2. 数字化图片演示3. 真实图片演示4. 补充:填充方式二.中值模糊1. 什么是中值模糊2. 数字化图片演示三.高斯模糊 一.均值模糊 1.什么是均值模糊 均值模糊就是对图像进行算术平均值模糊,...

    一.均值模糊

    1.什么是均值模糊

    均值模糊就是对图像进行算术平均值模糊,比如输入的卷积核维度是3x3,那么这个卷积核就是如图所示:
    [ 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 ] \left[\begin{matrix} \frac{1}{9} & \frac{1}{9} & \frac{1}{9}\\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9}\\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9} \end{matrix} \right] 919191919191919191
    假设我们传入的 k s i z e = ( k s i z e h , k s i z e w ) ksize = (ksize_h,ksize_w) ksize=(ksizeh,ksizew),那么均值模糊的卷积核就是:
    1 ( k s i z e h , k s i z e w ) ∗ [ 1 1 … 1 1 1 … 1 … … … 1 1 1 … 1 ] \frac{1}{(ksize_h,ksize_w)} * \left[\begin{matrix} 1 & 1 & … & 1\\ 1 & 1 & … & 1\\ … & …& … & 1\\ 1 & 1 & … & 1 \end{matrix} \right] (ksizeh,ksizew)11111111111

    • blur(src, ksize, dst=None, anchor=None, borderType=None)
    • 参数:ksize:卷积核的大小。dst,若填入dst,则将图像写入到dst矩阵。borderType:填充方式

    2. 数字化图片演示

    def blur_test():
        img = np.array([[1, 1, 1, 1, 1], 
                        [2, 2, 2, 2, 2], 
                        [3, 3, 3, 3, 3], 
                        [4, 4, 4, 4, 4], 
                        [5, 5, 5, 5, 5]], dtype=np.float32)
        print(img)
        dst = cv2.blur(img, (3, 3), borderType=cv2.BORDER_CONSTANT) 
        # 卷积核为3x3,填充方式为默认0填充
        print(dst)
    

    img经过borderType=cv2.BORDER_CONSTANT的填充之后,结果为
    [ 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 2 2 2 2 2 0 0 3 3 3 3 3 0 0 4 4 4 4 4 0 0 5 5 5 5 5 0 0 0 0 0 0 0 0 ] \left[\begin{matrix} 0 & 0 & 0& 0 &0 &0 &0 \\ 0 & 1 & 1& 1 &1 &1 &0 \\ 0 & 2 & 2& 2 &2 &2 &0 \\ 0 & 3 & 3& 3 &3 &3 &0 \\ 0 & 4 & 4& 4 &4 &4 &0 \\ 0 & 5 & 5& 5 &5 &5 &0 \\ 0 & 0 & 0& 0 &0 &0 &0 \\ \end{matrix} \right] 0000000012345001234500123450012345001234500000000
    (3,3)的卷积核为:
    [ 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 ] \left[\begin{matrix} \frac{1}{9} & \frac{1}{9} & \frac{1}{9}\\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9}\\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9} \end{matrix} \right] 919191919191919191
    进行卷积运算:
    [ 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 2 2 2 2 2 0 0 3 3 3 3 3 0 0 4 4 4 4 4 0 0 5 5 5 5 5 0 0 0 0 0 0 0 0 ] ∗ [ 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 ] \left[\begin{matrix} 0 & 0 & 0& 0 &0 &0 &0 \\ 0 & 1 & 1& 1 &1 &1 &0\\ 0 & 2 & 2& 2 &2 &2 &0\\ 0 & 3 & 3& 3 &3 &3 &0\\ 0 & 4 & 4& 4 &4 &4 &0\\ 0 & 5 & 5& 5 &5 &5 &0\\ 0 & 0 & 0& 0 &0 &0 &0\\ \end{matrix} \right] * \left[\begin{matrix} \frac{1}{9} & \frac{1}{9} & \frac{1}{9}\\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9}\\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9} \end{matrix} \right] 0000000012345001234500123450012345001234500000000919191919191919191

    
    最终的控制台输出为:
    [[1. 1. 1. 1. 1.]
     [2. 2. 2. 2. 2.]
     [3. 3. 3. 3. 3.]
     [4. 4. 4. 4. 4.]
     [5. 5. 5. 5. 5.]]
     
    [[0.6666667 1.        1.        1.        0.6666667]
     [1.3333334 2.        2.        2.        1.3333334]
     [2.        3.        3.        3.        2.       ]
     [2.6666667 4.        4.        4.        2.6666667]
     [2.        3.        3.        3.        2.       ]]
    

    3. 真实图片演示

    均值模糊用在真正的图片上时:

    
    def mean_blur(image):
      src = cv.blur(image,(10,10),borderType=cv.BORDER_CONSTANT)
      cv.namedWindow("mean_blur",cv.WINDOW_NORMAL)
      cv.imshow("mean_blur",src)
    
    
    image = cv.imread("test_pic.JPG")
    cv.namedWindow('input_image',cv.WINDOW_NORMAL)
    cv.imshow('input_image',image)
    mean_blur(image)
    cv.waitKey(0)
    cv.destroyAllWindows()
    

    Output:可以看出左边经过均值模糊之后的图片出现了明显的模糊现象。在这里插入图片描述

    4. 补充:填充方式

    上文中我们使用默认的填充方式borderType=cv2.BORDER_CONSTANT,还有好几种填充方式可以使用:具体情况可以参考 python+opencv之边缘填充一文

    填充方式解释
    cv.BORDER_REPLICATE复制法,即复制最边缘的像素 例如:aaaa/abcdefg/ggggg
    cv.BORDER_REFLECT反射法,即以最边缘的像素为对称轴
    cv.BORDER_WRAP外包装法,即以图像的左边界与右边界相连,上下边界相连。
    cv.BORDER_REFLECT_101反射法,即以最边缘的像素为对称轴

    想具体知道图片数字化之后的样子可以参考以下代码:

    import cv2 as cv
    import numpy as np
    
    img = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]], dtype=np.float32)
    
    top_size, bottom_size, left_size, right_size = (1, 1, 1, 1)
    replicate = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv.BORDER_REPLICATE)
    print(replicate)
    

    output:

    [[1. 1. 2. 3. 3.]
     [1. 1. 2. 3. 3.]
     [4. 4. 5. 6. 6.]
     [7. 7. 8. 9. 9.]
     [7. 7. 8. 9. 9.]]
    

    二.中值模糊

    1. 什么是中值模糊

    取卷积核中心的值作为卷积后的新值

    • mediaBlur(src, ksize, dst=None)
    • 参数:ksize:卷积核的大小。dst,若填入dst,则将图像写入到dst矩阵。
    • ⚠️:它没有填充方式的参数,它的默认填充方式为:cv.BORDER_REPLICATE

    2. 数字化图片演示

    import cv2 as cv
    import numpy as np
    
    img = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]], dtype=np.float32)
    
    dst = cv.medianBlur(img, 3)
    print(dst)
    

    Output:

    [[2. 3. 3.]
     [4. 5. 6.]
     [7. 7. 8.]]
    

    先将输入的图片 [ 1 2 3 4 5 6 7 8 9 ] \left[\begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ \end{matrix} \right] 147258369进行cv.BORDER_REPLICATE填充: [ 1 1 2 3 3 1 1 2 3 3 4 4 5 6 6 7 7 8 9 9 7 7 8 9 9 ] \left[\begin{matrix} 1 & 1 &2 &3 &3\\ 1 & 1 &2 &3 &3\\ 4 & 4 &5 &6 &6\\ 7 & 7 &8 &9 &9\\ 7 & 7 &8 &9 &9\\ \end{matrix} \right] 1147711477225883369933699再将3x3的卷积核中心值挑出来,就为最终结果。

    三.高斯模糊

    高斯模糊原理

    def Gauss_blur():
        img = np.array([[14, 15, 16], 
        				[24, 25, 26], 
        				[34, 35, 36]], dtype=np.float32)
        blur = cv2.GaussianBlur(img, (3, 3), 1.5)
        print(blur)
     
    Gauss_blur()
     
    # output:
    [[20.771631 21.156027 21.540426]
     [24.615604 25.       25.3844  ]
     [28.45958  28.843975 29.228374]]
    
    展开全文
  • 完整课件 1-9章 《神经模糊预测控制 及其MATLAB实现》
  • ztree模糊搜索demo

    千次下载 热门讨论 2016-07-31 12:39:48
    ztree模糊搜索demo,根据关键字显示叶子节点
  • 模糊测试技术简单整理(一)

    千次阅读 2022-04-10 16:53:35
    title: 模糊测试技术 seo_title: 模糊测试技术 author: sizaif toc: true mathjax: true tag: fuzzing 论文 sidebar: blogger toc categories: Master 论文 abbrlink: d619a3ee date: 2022-04-07 14:49:59 ...

    模糊测试技术

    2022-01-09-


    模糊测试基本流程: 预处理(preprocessing)、输入数据构造(input building)、输入选择(input selection)、评估(evalution)、结果分析(post-fuzzing)

    2013年AFL诞生,基于覆盖率引导的模糊测试成为主流方向

    AFL 是覆盖率为导向的模糊测试工具,通过插桩的方法,采集输入数据对应的边覆盖率,作为模糊测试种子选取的衡量指标.通过使用进化算法以及精心构造的突变策略

    预处理

    工作: 搜集目标相关信息并制定模糊测试的策略, 为监控目标在测试中的运行状态做必要的准备.通常依赖于插桩、符号执行以及污点分析这类程序分析技术

    搜集目标相关信息,比如目标的输入数据格式、目标的内部结构,并为监控测试中目标的状态变化做必要的准备.该环节面临的挑战是:使用什么程序分析技术,以及模糊测试究竟需要对目标内部信息有多详细的了解

    根据模糊测试对程序内部信息分析的程度,现代的模糊测试方法可以划分为3类:黑盒模糊测试 (blackGboxfuzzing)、灰盒模糊测试(greyGboxfuzzing) 和白盒模糊测试(whiteGboxfuzzing)

    1. 插桩:

    插桩技术通过向目标的代码中合适的位置添加预设好的代码,获得程序的静态或动态执行信息.比如程序的抽象语法树,覆盖率以及函数内变量取值等

    动态插桩

    动态插桩则是在运行的过程中对运行过的代码 进行插桩.比如利用 QEMU等模拟技术,进行动态插桩,可以获得程序运行时的信息,缺点是资源的开销大

    静态插桩

    通过 GCC编译器在汇编语言上插 桩,LLVM在生成的中间语言LLVMIR(low level virtual machine intermediate representation)上插桩.优点是节省时间、速度快,缺点是依赖于程序源码.

    插桩技术的缺点是会带来资源的开销

    2. 符号执行

    将程序行为的推理归结为逻辑领域的推理,通过构建一个表示程序执行的逻辑公式,可以同时推断一个程序在不同输入上的行为.

    该方法可以使模糊测试获得较好的覆盖率,并可以深入到程序深处,探寻可能存在漏洞的区域

    静态符号执行

    静态符号执行通常会因为程序中循环和递归的存在,陷入到路径爆炸中,还会因为路径约束中包含诸如取Hash值等操作,导致约束求解失败.由于存在这2种问题,使用较多的是动态符号执行

    动态符号执行

    动态符号执行通过对程序进行实际执行与符号化执行,维护程序的实际状态和符号化状态,通过将难以求解的约束替换为实际值,缓解了静态符号执行的问题,并按照深度优先的搜索策略对目标程序进行了探索.

    存在的问题:

    ①由于程序分支的存在,路径爆炸的问题仍然存在,程序越复杂, 路径爆炸的问题就越严重.解决的一种办法是通过启发式的方法,选择比较重要的路径进行探索.

    ②虽然动态符号执行使用实际值替换的方法,解决了一 部分静态符号执行无法绕过的约束,但是也会丢失 一些路径,造成探索结果的不完整.

    ③所有的符号执行技术都受限于约束求解方法的能力,比如如何处理类似取余操作这样的非线性约束,仍然是符号执行面临的挑战

    为了能够将符号执行更好地应用到模糊测试中,近年来诞生了一些工作,

    比如Pangolin 通过 [22] 允许符号执行重用之前的计算结果,

    Intriguer通 [23]过利用字段级的信息,都实现了对符号执行过程的加速.

    ILF[24] 通过使用神经网络,对由符号执行专家生成的大量高质量输入数据进行学习,得到了合适 的模糊测试策略
    [22] Huang Heqing,Yao Peisen,Wu Rongxin,et al.Pangolin incremental hybrid fuzzing with polyhedral path abstraction [C]∕∕ Procofthe2020IEEE Sympon Security and Privacy (SP).Piscataway,NJ:IEEE,2020:16131627
    [23] Cho M,Kim S,Kwon T.Intriguer field-level constraint solving for hybrid fuzzing [C]∕∕ procofthe2019 ACM SIGSAC Conf on Computer and Communications Security. New York: ACM,2019:515530
    [24] He Jingxuan,Balunovi M,AmbroladzeN,et al.Learning to fuzz from symbolic execution with application to smart contracts[C]∕∕Procofthe2019 ACM SIGSAC Conf on Computer and Communications Security.New York:A CM, 2019:531548

    3. 污点分析

    该技术会观测程序中,哪些程序数据受到了预先准备好的污染源(比如输入)的污染,目的是跟踪污染源和汇聚点(比如有敏感信息的程序数据)之间的信息流

    静态污点分析

    静态污点分析不需要程序实际运行,通过对程序静态分析,获得程序控制流图、抽象语法树等信息, 依据数据流以及依赖关系进行污点分析;

    动态污点分析

    动态污点分析则是在程序实际执行的过程中,利用程序的动态执行信息进行污点分析

    动态污点分析检测的可信度更高,但是检测结果是否全面, 取决于动态污点分析对程序的覆盖情况,而且动态污点分析会消耗更多的资源; 静态污点分析又会和符号执行一样,可能会陷入到路径爆炸中,而简化后的静态污点分析又存在着严重的过度污染问题

    将污点分析技术应用到模糊测试中,并降低其资源消耗是近年来的重要研究方向.比如GREYONE [25]尝试通过减少污点分析跟踪的对象、降低污点分析的开销、提升模糊测试的检测效率.

    [25] GanShuitao,ZhangChao,ChenPeng,etal.GREYONE dataflowsensitivefuzzing[C]∕∕Procofthe29thUSENIX SecuritySymposium.Berkeley,CA:USENIXAssociation, 2020:25772594

    基于AFL的模糊测试方法

    image-20220109150026279

    image-20220109150051850

    image-20220109150137214

    输入构造

    种子获取、种子筛选、种子突变
    

    具体的挑战是如何在尽量满足语法语义检查的情况下,短时间内生成 大量的输入,用以对目标做全面而深入分析.

    首先得到一个数据 S S S ,然后数据 S S S 按照一 定的策略进行一定次数的变异,获得大量新数据 I I I , 最后将 I I I输入到被测试对象中进行测试.其中数据 S S S 被称为种子(seed), I I I 是测试实际使用的输入数据

    评估

    现阶段的研究都会聚焦于模糊测试器在2个指标上的表现:覆盖率和暴露漏洞平均时间

    覆盖率是软件测试中的一个衡量指标,指的是在测试过程中,对象被覆盖到的数目占总数的比例. 通常而言,高覆盖率更可能发现更多的隐藏漏洞,众多研究因此集中在覆盖率提升上

    AFL 使用上下文无关的边覆盖率作为评估指标. [13]

    Angora 使用上下文敏感的分支覆盖率.[42]

    VUzzer 使用了块覆盖率替代边覆盖率作为覆盖率评估的对象.[41]

    暴露漏洞平均时间:

    暴露 漏 洞 平 均 时 间 被 Böhme46] AFLGo 选 做 评 估 指 标.在 与 基 准 模 糊 工 具 [46] AFL 的对比实验中,AFLGo 复现单个漏洞的 [13] [46] 时间远比AFL少,这证明了该评估指标的有效性. 此后Hawakeye[47] 同样使用了这一指标来证明其性 能.Parmesan 在通过sanitizer来发现潜在漏洞的 [63] 研究工作中,也是用暴露漏洞平均时间作为评估指 标同Angora [42] 等定向灰盒模糊工具进行比较

    结果分析

    结果分析发生在模糊测试结束以后,主要目的是对于模糊测试的输出信息进行分析和处理

    具体应用场景下的模糊测试

    物联网中的模糊测试

    主要面临两个问题:

    1. 将模糊测试应用到物联网领域问题就是特定物联网设备上运行的程序通常对于其实际硬件的配置有着高度的依赖性.

    ​ 简单的从固件中提取一个用户级别的程序,然后使用模糊测试进行检测,通常是行不通的

    Iot-Fuzzer[30] 认为大多数物联网设备通过其官方移动应用程序进行控制,并且此类应用程序通常包含有与设备进行通信所使用协议的丰富信息,因此通过识别和重用特定于程序的逻辑(比如加密)来改变测试用例(尤其是消息字段),就能够有效地对物联网目标进行模糊测试,而无需依赖于有关其协议规范的任何知识.

    1. 物联网设备远远无法满足模糊测试需要的吞吐率

      多项研究成果表明物联网设备采用全仿真的系统,可以获得最高的吞吐量,这是因为真实的物联网设备相比于桌面工作站或者服务器要慢得多

    内核安全中的模糊测试

    内核模糊测试通常利用暴露出来的系统调用接口和外围接口,从用户空间进入到内核组件中进行模糊测试,以检测内核中可能存在的漏洞

    主要面临的问题:

    1. Windows内核程序以及很多相关组件的源代码并 不开源,将导致传统的反馈机制不再适用.
    2. 内核中的代码由于存在中断、多线程操作等机制,使得模糊测试变的很复杂.
    3. 内核模糊测试一旦检测到程序的崩溃,将会导致整个操作系统重新启动,极大地影响了模糊测试的效率.

    为了克服这些问题,产生了一些专门针对内核安全进行模糊测试的研究,

    比如syzkaller [70] 是由Google开发的一种以获得高覆盖率为导向的内核 模糊测试工具,目前实际使用比较多,并经常被用于对比实验中.

    Razzer[71] 是基于syzkaller [70] 通过使用LLVM和修改后的SVF技术针对内核中存在的数据争用问题进行的模糊测试

    TriforceAFL[36] AFL [13]的QEMU模式,在系统模拟器的帮助下,通过跟踪分支信息,对Linux的内核进行模糊测试.

    kAFL[37] 通过利用Intel提供的进程追踪技术,获取代码运行时的控制流信息,并通过使用Intel的硬件 虚拟特征(VTGx)提升效率并使得kAFL[37] 独立于特定的操作系统

    传统的模糊测试应用到内核模糊测试上将面临着众多的问题,包 括内核态代码的复杂执行环境,以及内核崩溃的处 理问题.另外内核安全面临的威胁来源是不确定的, 可以是外部固件,也可以是第三方开发的驱动程序, 还可以是内核程序自身设计的问题.模糊测试在内 核安全领域的应用还有待进一步的研究.

    静态分析或模糊检测技术通常对内存溢出等漏洞有效,而无法挖掘协议实现库的逻辑漏洞.

    通过提取安全协议实现的状态机,能够实现对协议实现的形式化建模.

    展开全文
  • 计算特定雷达发射信号模糊函数的matlab代码
  • 人工智能学习——模糊控制

    千次阅读 2022-04-15 01:11:55
    模糊控制 文章目录模糊控制前言一、模糊控制是什么?与神经网络的区别?二、模糊控制原理1.模糊化2.模糊规则3.模糊推理4.解模糊化三、模糊控制算法实例解析(含代码)1、选择观测量和控制量参考 前言 鉴于个人学习...

    模糊控制


    前言

    鉴于个人学习方向并不在此,所以此文章仅作为个人学习笔记使用,主要介绍理论以及学习过程,仅供参考!


    一、模糊控制是什么?与神经网络的区别?

    为什么要有模糊控制、为什么要用神经网络、为什么还要将两者结合,还有那么多不同的结合方法等等问题的关键。两个理解模糊神经网络的重要前提:

    (1)模糊控制的基本思想是利用计算机来实现人的控制经验[;
    (2)人工神经网络是一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型;

    在历史的发展中,人类始终以自己为中心来建立世界的模型。数学的哲学本质也可以理解为人们对客观世界建立的主观模型,数学和哲学这两个东西是真的好,因为这是从另一种角度去阅读自然。模糊控制的诞生始于对客观世界复杂性和不确定性,当人们尝试探索一些物理过程内部的精确机理时,会发现有很多问题,“当一个系统复杂性增大时,人们能使它精确化的能力会降低,当达到一定阈值时,复杂性与精确性相互排斥”。这就意味着人无法完全掌握一些十分复杂的系统,实际上在实际应用中,也并不需要掌握,因为那些生产线上的工人不知道系统内部机理,他们控制系统的效果依然很好。这就是模糊控制,利用人的经验而不是系统内部原理来实现复杂系统控制。“人”或者“人脑”才是这个自然最完美的控制器,因此模拟人脑的过程就是人们为了实现完美控制的重要途经。


    二、模糊控制原理

    模糊控制是一种最简单的人脑模拟器

    1.模糊化

    import numpy as np
    import pandas as pd
    

    人在处理外部信息的时候,并没有量化数据这个概念,而是根据自己的经验来判断。比如,你现在的位置与帝都的距离。你可能觉得很远,因为你在魔都。但是如果你自己在河北、天津,你就觉得不是很远。而你在5环,你依旧觉得你依然离帝都很远。这个“很远”,“不是很远”其实就是模糊化,因为人的“传感器”不能给你一个完全精确的距离,但你也不必关心,你关心的是这个距离你打车大概花多少钱,比如便宜、还行、贵,也是模糊化的概念。这里其实输入就是距离这个模糊概念,输出就是花的钱这个模糊化后的概念。这些概念人是可以理解的,但是电脑可不行,要想实现自动化的控制,就需要把这些概念通过一些转换,映射到电脑里面去做计算。隶属度函数、模糊集合、模糊运算…其实这些总结为一句话就是如果把这些东西放到电脑里该怎么计算

    官方定义:
    (1)论域:由被考虑对象的所有元素的全体组成的基本集合,对应“全集”这个概念;
    (2)模糊子集:设论域 E ,E 到闭区间 [0,1] 的任一映射 ,它确定了 E 的一个模糊子集,简称模糊集。

    有了模糊子集的定义后就可以进入正题了 —— 隶属度函数。隶属度函数是模糊控制中的最重要的概念之一,它是由清晰输入到模糊输入的转变,是精确值到模糊语言的转化,也是模糊控制的第一步但是隶属度函数的设计上有很多要求,比如要符合客观规律,不能是主观臆想,还要能反映出客观模糊现象的具体特征。实际上,模糊隶属度函数的确定取决于设计控制系统的人,灵活性很大。灵活性大是好事,但也是坏事。隶属度函数的确定已经可以初窥人们对控制器的追求。灵活性通常意味着人们可以自己随便设定隶属度函数,而实际的应用中,很明显不是所有人都能设计初适应性特别好、精度特别高的隶属度函数。所以大家就都用那些设计好的隶属度函数,可以理解为专家设计的

    模糊隶属度函数的确定方法:

    (1)模糊统计法
    (2)二元对比排序法
    (3)专家经验法

    前面说灵活性,其实为了控制系统的性能着想,就要优化设计过程中的每一步,专家经验给定的就是比较准确的隶属度函数。总之不知道的时候就听专家的吧。其实,采用专家经验也是很多文献中采用的优化办法。

    (4)演绎推理法
    (5)角模糊集法
    (6)神经网络法

    神经网络也可以理解为是一种专家经验,通过试验数据或理论数据对一个网络进行训练,节省了训练“专家”的时间,并且降低了主观臆测的风险,因为神经网络是完全凭借数据说话的。你会发现在很多场合中,尤其是奥运会的评分项目中,人们都倾向于将评分尽量打的客观,避免“黑哨”,所以才有这个领域的专家,那么一旦神经网络模型完美模拟了人,那这些专家可真要喝西北风了。

    (7)遗传算法
    (8)归纳推理
    (9)借助常见模糊分布函数 (最常用)

    这里就不用说了,三角型、高斯型隶属度函数。

    模糊化得到的结果通常可以表示成语言变量,但是在计算机中则表现为一个具体的数值—隶属度。接下来就需要对这些隶属度做进一步处理——设计规则


    2.模糊规则

    模糊规则的设计实际上也十分灵活,取决于你的被控系统特性。比如要控制一个点的温度为50℃恒温。当它为40℃的时候你觉得可能是“偏低”,而我觉得“很低”,专家觉得“这样就行”,在误差范围内。那么结果就是你的行动是“稍微加热一下”,我的行动就是“全力加热”,专家直接“睡大觉”去了。这些行动其实就是规则,规则通常表现为查找表的形式,就是你让计算机去按照你设定的规则表去行动,如下表所示:
    在这里插入图片描述
    模糊控制最常采用的输入是实际输出与期望输出的误差(error)和误差变化率(error rate)两个量。这里需要做以下说明:

    假设模糊控制全部采用误差与误差变化率的7 * 7规则表作为控制规则,那么当系统为单输入单输出(SISO)情况下,有7 * 7 * 1 * 1个规则,其中这个1为单输入,第二个1为单输出。当系统为1输入2输出的情况下,可以推理,每个输出应对应一个规则表,则两个输出有7 * 7 * 1 * 2个规则。这里输入为1的原因是评价系统的参数为单一参数,即如果你控制一个系统的温度,那么就根据这个温度的误差和误差变化率来设计对应的输出条件。则对于多输入的情况下 7 * 7 * N * M个规则,我上一篇写了模糊控制静态特性中提到了模糊规则的设计,这对人工设计来说,工作量实在太大。这里我们就只说SISO系统的模糊控制。


    3.模糊推理

    模糊推理是模糊规则运算的过程。对于一个模糊系统或者一个模糊过程,人们通常只能近似地进行推理,以得出一个近似的结果,这种推理方式也叫做似然推理。不过在模糊控制系统中已经发展出了一些比较固定的推理方法。

    (1)Zadeh 推理

    Zadeh 几乎发展出来了一套系统化的模糊控制理论,当然也包括模糊推理的理论化过程。

    蕴含算子:
    在这里插入图片描述
    写成下面这个样子更容易理解:
    在这里插入图片描述
    如果你不知道该如何理解“算子”两个字,没多大问题。学过传递函数得概念的话,你可以把算子理解为一个广义的传递函数,就是有个输入来的东西,通过与这个算子做运算,就可以得到你要的输出。其实本质上就是把一个映射单独拿了出来,就叫算子了。

    (2)Mamdani 推理

    Mandani推理简单粗暴,而且有效
    在这里插入图片描述
    可以看到,在MATLAB的工具箱中,默认的就是他:

    在这里插入图片描述
    另外推理算法还有Baldwin、T’sukamato、Yager等推理算法。“通常把基于不精确的、不绝对可靠的或不完全的信息基础上的推理称为不确定性推理。同时,又把针对模糊系统的不确定性推理方法称为模糊推理方法。” 理解一下就是,在模糊系统中,基于不精确、不绝对可靠或信息不完全的推理就是模糊推理,也就是说,模糊推理本身上是无法做到完全准确的。注意啦,这是重点,这意味着我们可以把推理过程做到尽可能准确,那么用什么方法?—— 优化、神经网络…用你自己的办法


    4.解模糊化

    解模糊化的主要目的就是将模糊控制系统得到的模糊输出值映射到真实的世界中,而不再以模糊语言的形式来表示。最直观的理解如:求“很大”这个模糊语言的数值是多少。解模糊化也叫“去模糊化”、“清晰化”等。

    解模糊化最常用的几种方法:
    (1)最大隶属度法

    直接选择模糊输出中隶属度函数值最大的那个元素。
    优点:主要信息突出,计算简单;
    缺点:次要信息易丢失,方法粗糙,只适用于要求不高的模糊控制系统设计;

    (2)中位数法(重心法、质心法、面积中心法)

    目前最流行、合理的解模糊化方法。该方法将模糊控制系统中的中位数作为控制量。
    优点:相比最大隶属度法,重心法包含了模糊子集中的所有信息;
    缺点:计算复杂,尤其是在隶属度函数的论域为连续时,需要求解积分方程。

    (3)加权平均法

    适用于输出隶属度函数的模糊集是对称的。
    相比重心法,计算相对简单。

    (4)平均最大隶属度法

    与最大隶属度法类似,但这里的最大隶属度值可以不是一个,而是多个。

    (5)求和中心法

    与加权平均法相似,但这里求和的是各个隶属度函数的面积,而加权平均的是隶属度函数值。
    优点:计算速度很快。

    (6)最大面积中心法

    如果输出模糊集至少有两个凸的子区域,则最大面积凸子区域的重心作为输出的解模糊化值。

    (7)首尾最大值法


    三、模糊控制算法实例解析(含代码)

    首先来看一个实例,控制进水阀S1和出水阀S2,使水箱水位保持在目标水位O处请添加图片描述
    按照日常操作经验,有以下规则:
    1、 若当前水位高于目标水位,则向外排水,差值越大,排水越快;
    2、 若当前水位低于目标水位,则向内注水,差值越大,注水越快;
    3、 若当前水位和目标水位相差很小,则保持排水速度和注水速度相等。

    1、选择观测量和控制量

    将偏差e划分为5个模糊集,负大(NB)、负小(NS)、零(ZO)、正小(PS)、正大(PB),e为负表示当前水位低于目标水位,e为正表示当前水位高于目标水位。设定e的取值范围为[-3,3],隶属度函数如下。
    下面来设计一个模糊控制器
    请添加图片描述

    %水位模糊控制算法
    clear all;
    close all;
     
    a = newfis('fuzzy tank');
     
    a = addvar(a,'input','e',[-3,3]);
    a = addmf(a,'input',1,'NB','zmf',[-3,-1]);
    a =addmf(a,'input',1,'NS','trimf',[-3,-1,1]);
    a =addmf(a,'input',1,'ZO','trimf',[-2,0,2]);
    a =addmf(a,'input',1,'PS','trimf',[-1,1,3]);
    a = addmf(a,'input',1,'PB','smf',[1,3]);
     
    a = addvar(a,'output','u',[-4,4]);
    a = addmf(a,'output',1,'NB','zmf',[-4,-2]);
    a =addmf(a,'output',1,'NS','trimf',[-4,-2,0]);
    a =addmf(a,'output',1,'ZO','trimf',[-2,0,2]);
    a =addmf(a,'output',1,'PS','trimf',[0,2,4]);
    a = addmf(a,'output',1,'PB','smf',[2,4]);
     
    %建立模糊规则
    rulelist=[1 1 1 1;
             2 2 1 1;
             3 3 1 1;
             4 4 1 1;
             5 5 1 1];
    a = addrule(a,rulelist);
     
    %设置反模糊化算法
    a1 = setfis(a,'DefuzzMethod','mom');
    writefis(a1,'tank');
    a2 = readfis('tank');
     
    figure(1);
    plotfis(a2);
    figure(2);
    plotmf(a,'input',1);
    figure(3);
    plotmf(a,'output',1);
     
     
    showrule(a);
    ruleview('tank');
     
    for i=1:1:7
       e(i)=i-4;
       Ulist(i)=evalfis([e(i)],a2);
    end
    Ulist = round(Ulist);  %对决策结果四舍五入取整
     
    disp('------------------------------------------------------');
    disp('----------模糊控制表:e =[-3,3], u = [-4,4]-----------');
    disp('------------------------------------------------------');
    fprintf('| a  |');
    fprintf(' %d  |',e);
    fprintf('\n');
    fprintf('| u  |');
    fprintf(' %d  |',Ulist);
    fprintf('\n');
    

    参考

    链接1
    链接2

    展开全文
  • 模糊控制算法的C++实现

    千次阅读 2021-04-29 19:04:15
    在现代智能控制算法中,模糊控制是在实际控制系统设计中使用比较成熟的一种方法。模糊控制可以使用在一些无法建立系统模型的场合,根据专家经验确定模糊规则,实现对系统的控制。本篇文章适合对模糊控制算法有一定...
  • 模糊综合评价就是用隶属度把模糊概念的定性评价转化为定量评价,能较好地解决模糊的、难以量化的问题。本文详细讲解了关于模糊评价的基本概念,隶属函数的确定以及构建一级模糊综合评价和多级模糊综合评价模型解决...
  • MATLAB图像模糊复原

    千次阅读 2021-08-25 11:59:15
    目 录摘要 2一、概述 31.1选题背景 31.2课程设计目的 41.3设计内容 5二、图像退化与复原 62.1图像退化与复原的定义 62.2图像退化模型 72.3运动模糊图像复原的方法 72.3.1逆滤波复原法 82.3.2维纳滤波的原理 9三、...
  • 什么是模糊集呢?模糊集相对于普通集合而言,用隶属度用函数表示,普通集合用特征函数表示。当然,他俩都是在论域下的。 支集( SuppA={x∣x∈U,A(x)>0SuppA=\{x|x\in U,A(x)>0SuppA={x∣x∈U,A(x)>0)是F集合(模糊集...
  • 在 Python 中使用 OpenCV 高斯模糊我这张的丑脸

    千次阅读 多人点赞 2021-06-06 14:00:08
    在本篇博客中,你将学习如何使用 Python 中的 OpenCV 库模糊图像和视频中的人脸。 为了模糊图像中显示的人脸,首先检测这些人脸及其在图像中的位置。对此,查看之前的一篇关于人脸检测的教程,在这里使用人脸检测的...
  • 模糊系统与模糊控制教程 王立新 经典 a course in fuzzy systems and control 的中文版
  • 1、模糊矩阵 定义 : 如果对于任意 i=1,2,⋯ ,m;j=1,2,⋯ ,n,i=1,2, \cdots, m ; j=1,2, \cdots, n,i=1,2,⋯,m;j=1,2,⋯,n, 都有 rij∈[0,1],r_{i j} \in[0,1],rij​∈[0,1], 则称R=(ri,j)m×nR=(r_{i,j})_{m\...
  • C#WinForm的ComboBox控件自定义实现自动模糊匹配查找数据的方法 与控件自带的AutoCompleteMode类似,完美实现模糊匹配,解决AutoCompleteMode只能从左向右匹配的问题
  • 模糊逻辑学习--模糊逻辑的基础

    千次阅读 多人点赞 2020-06-28 19:58:33
    模糊逻辑的基础 总览 模糊逻辑的重点是将输入空间映射到输出空间,而执行此操作的主要机制是一系列if-then语句(称为规则)。所有规则都是并行评估的,规则的顺序并不重要。规则本身很有用,因为它们引用变量和...
  • 【游戏开发小技】Unity通过UI全屏图来模糊场景画面(Shader | 模糊 | 滤镜 | Blur)
  • 为了实现这一目标,我们分析了IoT设备配套应用程序,重点是确定有效的模糊触发:当用作模糊化入口点时,这些功能可以最大限度地增加设备固件上执行的唯一代码量,从而可能触发与安全相关的bug。举例来说,将应用程序...
  • 前端js模糊搜索(模糊查询)

    千次阅读 2021-06-12 15:31:04
    js的模糊查询 在项目中会用到模糊查询,之前在首页是用的element的tree显示的目录,会有用到搜索,但tree里边会有自带的模糊查询,用filter-node-method方法使用 但上次的项目中 又涉及到不试 ... 模糊查询基于select...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 676,154
精华内容 270,461
关键字:

模糊

友情链接: Epson_SCP600.zip