精华内容
下载资源
问答
  • 2021-04-23 15:09:12

    输电线路覆冰图像的Canny算子改进算法研究

    %20139.jpg

    摘 要: 每到冬季

    关键词: 形态学滤波; Canny算子; 边缘检测; 覆冰检测; 微分算子

    中图分类号:TM755 文献标志码:A文章编号:1006-8228(2019)02-54-04

    Research on improved algorithm of Canny operator for ice coating image

    of transmission lines

    Zhou Min, Wu Bing

    (School of Electrical Engineering and Automation, Henan Polytechnic University, Jiaozuo, Henan 454000, China)

    Abstract: Icing problems in winter transmission lines often have serious consequences for power supply safety. Accurate ice edge detection is a key issue in ice thickness calculation. The improved Canny operator’s excellent edge detection performance is used for ice edge detection. It is proposed to use the morphological filtering based denoising method instead of the traditional Gaussian filtering, combined with the influence of the diagonal direction elements, to detect the edges with the improved Canny operator, and provide reliable technical support for calculating the ice thickness. The research shows that this method can accurately detect the edge of ice coating compared with the traditional edge detection algorithm, which is of great significance for ice thickness calculation and deicing technology.

    Key words: morphological filtering; Canny operator; edge detection; ice detection; differential operator

    0 引言

    輸电线路覆冰

    传统的边缘检测算子如Roberts、Sobel和Prewitt等都是梯度算子[2],由于以上算子对噪声极其敏感,所以在处理实际图像时效果不好。数学形态学在1964年被提出,主要用来处理生物体的形态结构。数学形态学的开闭运算能够有效滤噪声并且对含有噪声的图像进行平滑滤波处理具有良好的效果[3]。1986年,Canny提出了Canny边缘检测算子,它是一种多级检测算法[4]。虽然在噪声上相对传统的边缘检测算子有所提高,但是由于其采用高斯滤波时丢失了大量细节,导致出现伪边缘的情况。

    近几年来,各种改进的Canny算子也相应地出现。段红艳等人采用双边滤波代替传统高斯滤波,控制双边滤波器权重参数并且利用小波变换对图像放大高频系数缩小低频系数,增强图像细节[5]。许瑞等人利用数学形态学与小波变换相结合的方法,用数学形态基本运算对噪声图像进行滤波,利用小波变换原理提取图像边缘[6]。因为图像种类不同,纹理特征等也各不相同,国内外学者对于图像的边缘检测方法有上千种,对于不同类型的图像能够选取合适的算法,不仅在检测精度上有所提高,而且在速度方面也能大大提升。因此,本文用摄像机直接拍摄的覆冰图片进行研究,提出使用Canny算子改进的方法来检测输电线路覆冰图像的边缘。

    1 输电线路覆冰监测系统组成

    输电线路覆冰在线系统能在线监测运行在恶劣大气环境中的高压输电线路的覆冰情况。这种系统采用CCD摄像机,当温度在0℃以下以及湿度大于85%时,摄像机采集输电线路的图像数据信息,再经过GPRS(CDMA)网络将图像数据传输到Internet网络[7],然后,Internet网络把图像数据传输至控制中心的计算机系统。电力系统控制中心的计算机系统通过分别处理采集到的输电线路覆冰前后的图片,对导线覆冰前后检测出精确的边缘,在通过相应的方法计算出覆冰厚度,以检测是否严重覆冰。具体过程如图1所示。 2 输电线路覆冰图像处理算法研究

    2.1 数学形态学

    数学形态学对图像处理可以实现图像填充、细化、分割、去噪等常见的图像处理任务[8]。由于对二值图像处理有时候不能满足图像处理的要求,而对灰度图像的处理,才是有实际研究的意义。数学形态学的基本思想是用具有一定形状和尺寸的结构元素去提取图像中的对应形状。

    数学形态学源于填充,我们可利用填充概念直接定义其基本运算。则结构元素g对图像f的腐蚀定义为:

    若想知道f被g腐蚀的结果情况,可以在空间滑动结构元素,当其原点与x点重和的时候,向上推这个结构元素,在信号下方,结构元素所能达到的最大值,即为该点的腐蚀结果。腐蚀是一种消除边界点,使边界点向内收缩的过程[9]。可以用来消除小且无意义的物体。

    在定义灰值腐蚀时,利用结构元素的反射,使图像信号保持在结构元素的定义域内。然后,上推结构元素使其超过图像信号的最小值来定义灰值膨胀[10]。则f被g膨脹可逐点定义为:

    可用式⑶表示膨胀与腐蚀具有对偶性:

    其中:fc表示f的补集,-g为g相对原点旋转180?后的元素。

    先腐蚀再膨胀的迭代运算就是灰值开运算,定义如下:

    开运算在消除小物体、在细微点处分离物体以及平滑较大物体边缘的同时并不明显的改变其面积[11]。

    利用灰度的对偶性来定义闭运算,定义如下:

    闭运算在填充物体内细小部分以及平滑图像信号边界的同时并不明显改变其面积。

    2.2 细胞神经网络的结构

    细胞神经网络CNN在1988年被提了出来[12]。最初由Chua和Yang提出的模型中,每个细胞是一维动力系统,它是CNN的基本单元。任何一个细胞仅与它相邻的细胞连接,即相邻的细胞相互直接作用。二维M×N阵列细胞中,在(i,j)位置上的细胞可用Cij表示,它的邻域半径r-邻域细胞可由下式定义:

    其中邻域r是一个整数。每个细胞有一个状态x,一个常系数外部输入u和一个输出y。时间连续的细胞的等效框图如图2所示。

    下列一阶微分方程表示CNN的动力方程:

    其中细胞Cij的状态是xij,I是一个独立偏置常数,C和R都是系统时间常数。由⑺式可知,其中f可以是任何合适的非线性方程。

    下列微分方程也可以表示二维CNN细胞网络:

    其中:,,xij和yij分别表示网络的状态和输出。Iij是常系数偏置矢量。Tij是常系数矩阵,它与互联矩阵有关。

    2.3 基于数学形态学滤波的开闭运算

    根据以上介绍的定义及其集合运算,我们可以用下列方法来实现细胞神经网络CNN的开闭运算。

    若X是二值的活动图像,且为M×N阵列,S为二值结构元,尺寸为(2r+1)×(2r +1),其下标在-r~r之间变化,那么当满足下列条件之一时,点(i,j)属于。

    ⑴ 对所有满足S(k-i,l-j)=1 的X,有X(k,l)=1。

    ⑵ 存在满足S(m-i,n-j)=1的(m,n)∈Nr(i,j),使(m,n)满足情形1。

    若令模板A 映射为上述中的二值结构元S,模板C映射为结构元素S[13]。映射为输入图像X,R=1.0,并按下式定义函数p(·)、q(·)和f(·):

    其中,,,初始状态矩阵可按照式⑿映射到图像X:

    则输出矩阵的极限就是映射为。

    利用开闭运算的对偶性,则其输出函数为:

    则输出矩阵的极限将映射为。

    本文采用3×3邻接像素模板,动态实现形态学的滤波。即使用微分方程组用对差分方程的近似迭代方法来实现。

    2.4 改进的Canny边缘检测

    Canny边缘检测具有三个准则,分别是:好的边缘定位准则、单边响应准则、好的边缘检测准则[14]。并且有准确的数学表达式来定性地描述这三个准则。传统的Canny边缘检测计算过程简单,检测结果优于其他的一阶微分检测算子,因而得到了广泛的应用[15]。

    为了提高边缘检测的准确性,算法采用3×3邻域的有限差分来计算,考虑了对角线方向的像素的影响[16],进一步提高了其算法的抗噪性。

    00方向的偏导数计算如下:

    900方向的偏导数计算如下:

    450方向的偏导数计算如下:

    1350方向的偏导数计算如下:

    进而,可以求出水平及垂直方向的差分如下。

    垂直方向:

    水平方向:

    图像中每个像素点(i,j)的梯度幅值K(i,j)梯度方向为:

    (21)

    qx(i,j)和qy(i,j)分别表示图像在x和y方向的偏导数。根据公式(20)和(21)求出的梯度方向和幅值。

    改进的Canny算法实现步骤如下。

    第一步:用本文介绍的基于形态学滤波的方法代替Canny算法中的高斯滤波。

    第二步:获取图像中包含对角线元素的像素点的信息,并根据公式(20)和(21)计 算像素点的幅值和梯度方向。

    第三步:对图像中的像素点的梯度和幅值做非极大值抑制运算。 第四步:利用双阈值确定不同阈值下的边缘连接。设高阈值为L1,低阈值为L2。则若梯度幅值L>L1则为图像的边缘;若L3 仿真与结论

    使用Matlab仿真软件进行仿真验证分析。图3是摄像机拍摄的输电线路覆冰图像。图4是Robert算子检测的边缘图像,从图中可知,把不是边缘的像素点当做边缘检测了出来。图5是Sobel算子检测的边缘图像。图6是用Prewitt算子检测的边缘图片。图7是用Canny算子检测出来的边缘图像,图8是本文改进的Canny算子邊缘检测算法。

    分析图3-图8可知,用动态的形态学滤波代替传统的高斯滤波,并且考虑对角线像素对边缘检测的影响,其在抗噪性能上和边缘检测性能上都有所提高。这是一种有效的边缘检测方法,为输电线路覆冰厚度的测量提供了可靠的技术支持,同时也为电网输电线路及时采取除冰措施提供了依据。

    参考文献(References):

    [1] 张伟,王军锋,王涛等.一种基于改进算子的形态学边缘检测算法[J].计算机技术及发展,2013.23(6): 23-26

    [2] 靳艳红,蒙建军.一种基于Canny算子改进的边缘检测算法[J].重庆文理学院学报(自然科学版),2011.30 (2):27-29

    [3] 崔屹,图像处理与分析:数学形态学方法及应用[M]科学出版社,2000.

    [4] 宗露艳,吴陈.一种改进的Canny 算子边缘检测算法[J].现代电子技术,2011.34(4):104-106

    [5] 段红燕,邵豪等.一种基于Canny算子的图像边缘检测改进算法[J].上海交通大学学报,2016.50(12):1861-1865

    [6] 许端,董文锋等,基于数学形态学与小波变换的边缘检测算法[J].计算机应用,2012,32(s2):165-167

    [7] 彭磊.输电线路覆冰在线检测系统的设计[D].河南理工大学,2012.

    [8] Breen E J,Jones R,Talbot H.Mathematical morphology:Auseful set of tools for image analysis [J].Statistics and Computing,2000.10(2):105-120

    [9] 孙继平,吴冰等.基于膨胀腐蚀运算的神经网络图像预处理方法及其应用研究[J].计算机学报,2005.28(6):985-990

    [10] 黄海龙,王宏.一种基于小波变换和数学形态学的边缘检测算法[J].东北大学学报(自然科学版),2011.32(9):1315-1318

    [11] 杨红,崔艳.基于开运算暗通道和优化边界约束的图像去雾算法[J].光子学报,2018.47(6).

    [12] M.Forti,”On global asymptotic stability of a class ofnonlinear systems arising in neural networks theory,” J.Differential Equations,1994.113(1):246-164

    [13] 李刚,光学数字图像增强算法及应用研究[D].太原科技大学,2012.

    [14] 张桂梅,孙晓旭,陈彬彬等.结合分数阶微分和Canny算子的边缘检测[J].中国图像图形学报,2016.21(8):1028-1038

    [15] 赵岩,周百灵.一种改进的基于Canny边缘检测算法[J].吉林大学学报,2012.50(4):740-744

    [16] 段锁林,殷聪聪等.改进的自适应Canny边缘将检测算法[J].计算机工程与设计,2018.39(6):1645-1650

    更多相关内容
  • Canny算法详解

    2014-03-29 15:18:44
    Canny算法详解
  • canny边缘检测,使用canny算法进行图像边缘检测,阈值在代码里-canny edge detection, using canny edge detection algorithm, the threshold in the code
  • Canny算法调参软件

    2019-11-03 17:52:07
    调节canny算法的高低阈值,可以选择锁定高低阈值比,也可以解除锁定。 可以直接选择载入的图片,不用重启程序和重改代码。 代码见: https://github.com/borninfreedom/opencv 记得star。 ...

    代码见: https://github.com/borninfreedom/opencv

    记得star。

    调节canny算法的高低阈值,可以选择锁定高低阈值比,也可以解除锁定。

     

    可以直接选择载入的图片,不用重启程序和重改代码。

    代码见: https://github.com/borninfreedom/opencv

    记得star。

    展开全文
  • 软件基于Canny算子,可以对任何图像进行边缘提取。。。
  • 摘 要: 通过对传统Canny边缘检测算法的分析提出了相应的改进方法。...本文对原始Canny算法进行了分析、改进,并在FPGA中实现。实验证明新算法能满足实时性要求,而且检测精度和抗噪能力也较理想。
  • Canny 边缘检测算法由计算机科学家 John F. Canny于 1986 年提出的。其不仅提供了算法,还带来了一套边缘检测的理论,分阶段的解释如何实现边缘检测。Canny检测算法包含下面几个阶段:1.灰度化2.高斯模糊3.计算图片...

    编辑推荐:

    本文主要介绍了一套边缘检测的理论,分阶段的解释如何实现边缘检测,希望对您的学习有所帮助。

    本文来自于简书,由火龙果软件Alice编辑,推荐。

    Canny 边缘检测算法由计算机科学家 John F. Canny

    于 1986 年提出的。其不仅提供了算法,还带来了一套边缘检测的理论,分阶段的解释如何实现边缘检测。Canny

    检测算法包含下面几个阶段:

    1.灰度化

    2.高斯模糊

    3.计算图片梯度幅值

    4.非极大值抑制

    5.双阈值选取

    灰度化

    灰度化实际上是一种降维的操作,可以减少计算。如果算法不进行色彩相关的识别的话,不灰度化,也可以直接进行后面的阶段。

    # 灰度化

    def gray(self, img_path):

    """

    计算公式:

    Gray(i,j) = [R(i,j) + G(i,j) + B(i,j)] / 3

    or :

    Gray(i,j) = 0.299 * R(i,j) + 0.587 * G(i,j) +

    0.114 * B(i,j)

    """

    # 读取图片

    img = plt.imread(img_path)

    # BGR 转换成 RGB 格式

    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    # 灰度化

    img_gray = np.dot(img_rgb[...,:3], [0.299, 0.587,

    0.114])

    return img_gray

    高斯模糊

    在实际的图片中,都会包含噪声。但有时候,图片中的噪声会导致图片中边缘信息的消失。对此的解决方案就是使用高斯平滑来减少噪声,即进行高斯模糊操作。该操作是一种滤波操作,与高斯分布有关,下面是一个二维的高斯函数,其中

    (x, y) 为坐标,σ 为标准差:

    0f422cad22545731f59bbbd7330328ca.png

    进行高斯滤波之前,需要先得到一个高斯滤波器(kernel)。如何得到一个高斯滤波器?其实就是将高斯函数离散化,将滤波器中对应的横纵坐标索引代入高斯函数,即可得到对应的值。不同尺寸的滤波器,得到的值也不同,下面是

    (2k+1)x(2k+1) 滤波器的计算公式 :

    e051ecf69ea06840784fb2609aa0225e.png

    常用尺寸为 5x5,σ=1.4 的高斯滤波器。下面是 5x5 高斯滤波器的实现代码:

    # 去除噪音 - 使用 5x5

    的高斯滤波器

    def smooth(self, img_gray):

    # 生成高斯滤波器

    """

    要生成一个 (2k+1)x(2k+1) 的高斯滤波器,滤波器的各个元素计算公式如下:

    H[i, j] = (1/(2*pi*sigma**2))*exp(-1/2*sigma**2((i-k-1)**2

    + (j-k-1)**2))

    """

    sigma1 = sigma2 = 1.4

    gau_sum = 0

    gaussian = np.zeros([5, 5])

    for i in range(5):

    for j in range(5):

    gaussian[i, j] = math.exp((-1/(2*sigma1*sigma2))*(np.square(i-3)

    + np.square(j-3)))/(2*math.pi*sigma1*sigma2)

    gau_sum = gau_sum + gaussian[i, j]

    # 归一化处理

    gaussian = gaussian / gau_sum

    # 高斯滤波

    W, H = img_gray.shape

    new_gray = np.zeros([W-5, H-5])

    for i in range(W-5):

    for j in range(H-5):

    new_gray[i, j] = np.sum(img_gray[i:i+5, j:j+5]

    * gaussian)

    return new_gray

    图片梯度幅值

    边缘是图像强度快速变化的地方,可以通过图像梯度幅值,即计算图像强度的一阶导数来识别这些地方。由于图片是离散的,可以用有限导数来近似图片的梯度:

    874a57b2bb6126137e044a6aa782e2e6.png

    图片梯度幅值为:

    324f27af2960adc8eeb202f0cc91cdbe.png

    梯度方向为:

    b1d3ec234a8c178e0bf619a7995c276f.png

    实现代码如下:

    # 计算梯度幅值

    def gradients(self, new_gray):

    """

    :type: image which after smooth

    :rtype:

    dx: gradient in the x direction

    dy: gradient in the y direction

    M: gradient magnitude

    theta: gradient direction

    """

    W, H = new_gray.shape

    dx = np.zeros([W-1, H-1])

    dy = np.zeros([W-1, H-1])

    M = np.zeros([W-1, H-1])

    theta = np.zeros([W-1, H-1])

    for i in range(W-1):

    for j in range(H-1):

    dx[i, j] = new_gray[i+1, j] - new_gray[i, j]

    dy[i, j] = new_gray[i, j+1] - new_gray[i, j]

    # 图像梯度幅值作为图像强度值

    M[i, j] = np.sqrt(np.square(dx[i, j]) + np.square(dy[i,

    j]))

    # 计算 θ - artan(dx/dy)

    theta[i, j] = math.atan(dx[i, j] / (dy[i, j] +

    0.000000001))

    return dx, dy, M, theta

    非极大值抑制(NMS)

    理想情况下,最终得到的边缘应该是很细的。因此,需要执行非极大值抑制以使边缘变细。原理很简单:遍历梯度矩阵上的所有点,并保留边缘方向上具有极大值的像素。

    6357ffa108b420dc18d4db86d715953a.png

    梯度方向与边缘方向相互垂直

    下面说说 NMS 的细节内容。NMS 在 4 个方向上进行,分别是

    0,90,45,135,没有角度包含两个领域,因此,一共用八个领域:上,下,左,右,左上,左下,右上,右下,如下图所示,C

    周围的 8 个点就是其附近的八个领域。

    c5aa2fb31ae6679e6d84ca3dc6adb2d0.png

    这样做的好处是简单, 但是这种简化的方法无法达到最好的效果, 因为,自然图像中的边缘梯度方向不一定是沿着这四个方向的。因此,就有很大的必要进行插值,找出在一个像素点上最能吻合其所在梯度方向的两侧的像素值。

    NMS 是要找出局部最大值,因此,需要将当前的像素的梯度,与其他方向进行比较。如下图所示,g1,g2,g3,g4

    分别是 C 八个领域中的 4 个点,蓝线是 C 的梯度方向。如果 C 是局部最大值的话,C 点的梯度幅值就要大于梯度方向直线与

    g1g2,g4g3 两个交点的梯度幅值,即大于点 dTemp1 和 dTemp2 的梯度幅值。上面提到这种方法无法达到最好的效果,因为

    dTemp1 和 dTemp2 不是整像素,而是亚像素。亚像素的意思就是在两个物理像素之间还有像素。

    那么,亚像素的梯度幅值怎么求?可以使用线性插值的方法,计算 dTemp1 在 g1,g2 之间的权重,就可以得到其梯度幅值。计算公式如下:

    weight = |gx|

    / |gy| or |gy| / |gx|

    dTemp1 = weight*g1 + (1-weight)*g2

    dTemp2 = weight*g3 + (1-weight)*g4

    下面两幅图是 y 方向梯度值比较大的情况,即梯度方向靠近 y 轴。所以,g2

    和 g4 在 C 的上下位置,此时 weight = |gy| / |gx| 。左边的图是 x,y

    方向梯度符号相同的情况,右边是 x,y 方向梯度符号相反的情况。

    7e468c8adb694365b44aad32d78e3358.png

    对于左边的图来说,以 C 点为当前位置 - d[i, j] ,那么

    g2 在 C 的前一行,g4 在 C 的后一行,所以位置坐标是:
    g2 = d[i-1,

    j];g4 = d[i+1, j]。根据左图的位置关系可以得到:g1 = d[i-1, j-1];g3

    = d[i+1, j+1]。

    同理,根据右图的位置关系可以得到:g1 = d[i-1, j+1];g3 = d[i+1, j-1]。

    下面两幅图是 x 方向梯度值比较大的情况,即梯度方向靠近 x 轴。所以,g2

    和 g4 在 C 的左右位置,此时 weight = |gy| / |gx| 。左边的图是 x,y

    方向梯度符号相同的情况,右边是 x,y 方向梯度符号相反的情况。

    147801a3de6df99a936c2479ae9dc2c4.png

    由上面可知,可以得到如下信息:g2 = d[i, j-1];g4 =

    d[i, j+1];

    左图:g1 = d[i+1, j-1];g3 = d[i-1, j+1];

    右图:g1 = d[i-1, j-1];g3 = d[i+1, j+1]。

    下面的这两幅图,可能会带来理解帮助:

    acadc181666d7c3f24ef3905ce0004d0.png

    然后,根据以上信息,代码实现如下:

    def NMS(self,

    M, dx, dy):

    d = np.copy(M)

    W, H = M.shape

    NMS = np.copy(d)

    NMS[0, :] = NMS[W-1, :] = NMS[:, 0] = NMS[:, H-1]

    = 0

    for i in range(1, W-1):

    for j in range(1, H-1):

    # 如果当前梯度为0,该点就不是边缘点

    if M[i, j] == 0:

    NMS[i, j] = 0

    else:

    gradX = dx[i, j] # 当前点 x 方向导数

    gradY = dy[i, j] # 当前点 y 方向导数

    gradTemp = d[i, j] # 当前梯度点

    # 如果 y 方向梯度值比较大,说明导数方向趋向于 y 分量

    if np.abs(gradY) > np.abs(gradX):

    weight = np.abs(gradX) / np.abs(gradY) # 权重

    grad2 = d[i-1, j]

    grad4 = d[i+1, j]

    # 如果 x, y 方向导数符号一致

    # 像素点位置关系

    # g1 g2

    # c

    # g4 g3

    if gradX * gradY > 0:

    grad1 = d[i-1, j-1]

    grad3 = d[i+1, j+1]

    # 如果 x,y 方向导数符号相反

    # 像素点位置关系

    # g2 g1

    # c

    # g3 g4

    else:

    grad1 = d[i-1, j+1]

    grad3 = d[i+1, j-1]

    # 如果 x 方向梯度值比较大

    else:

    weight = np.abs(gradY) / np.abs(gradX)

    grad2 = d[i, j-1]

    grad4 = d[i, j+1]

    # 如果 x, y 方向导数符号一致

    # 像素点位置关系

    # g3

    # g2 c g4

    # g1

    if gradX * gradY > 0:

    grad1 = d[i+1, j-1]

    grad3 = d[i-1, j+1]

    # 如果 x,y 方向导数符号相反

    # 像素点位置关系

    # g1

    # g2 c g4

    # g3

    else:

    grad1 = d[i-1, j-1]

    grad3 = d[i+1, j+1]

    # 利用 grad1-grad4 对梯度进行插值

    gradTemp1 = weight * grad1 + (1 - weight) *

    grad2

    gradTemp2 = weight * grad3 + (1 - weight) *

    grad4

    # 当前像素的梯度是局部的最大值,可能是边缘点

    if gradTemp >= gradTemp1 and gradTemp >=

    gradTemp2:

    NMS[i, j] = gradTemp

    else:

    # 不可能是边缘点

    NMS[i, j] = 0

    return NMS

    双阈值选取

    这个阶段决定哪些边缘是真正的边缘,哪些边缘不是真正的边缘。为此,需要设置两个阈值,minVal

    和 maxVal。梯度大于 maxVal 的任何边缘肯定是真边缘,而 minVal 以下的边缘肯定是非边缘,因此被丢弃。位于这两个阈值之间的边缘会基于其连通性而分类为边缘或非边缘,如果它们连接到“可靠边缘”像素,则它们被视为边缘的一部分。否则,也会被丢弃。

    c5fbf92685efb08722144b1e0bfb688d.png

    代码如下所示:

    def double_threshold(self,

    NMS):

    W, H = NMS.shape

    DT = np.zeros([W, H])

    # 定义高低阈值

    TL = 0.1 * np.max(NMS)

    TH = 0.3 * np.max(NMS)

    for i in range(1, W-1):

    for j in range(1, H-1):

    # 双阈值选取

    if (NMS[i, j] < TL):

    DT[i, j] = 0

    elif (NMS[i, j] > TH):

    DT[i, j] = 1

    # 连接

    elif (NMS[i-1, j-1:j+1] < TH).any() or (NMS[i+1,

    j-1:j+1].any()

    or (NMS[i, [j-1, j+1]] < TH).any()):

    DT[i, j] = 1

    return DT

    边缘检测结果

    经过以上 5 个过程,可以得到如下结果:

    9954809720e4fd85073209532dd351d3.png

    将其与 OpenCV,skimage 算法进行对比:

    2ca5de82124fcf84795967b452f7ced6.png

    我个人感觉 OpenCV 的结果是最好的,其次是 Skimage 的结果。自己的算法结果有些地方还是蛮粗糙的。

    展开全文
  • Canny 算法详解

    2011-03-22 17:58:00
    边缘提取以及边缘增强是不少图像处理软件都具有的基本功能,它的增强效果很明显,在用于识别的应用中,图像边缘也是非常重要的特征之一。 图像边缘保留了原始图像中相当重要的部分信息,而又使得总的数据量减小了很...
  • 基于图片分割的Canny边缘检测算法优化方案 摘要

    源代码下载地址

    摘要

    对于Canny边缘检测算法,本文利用了Vivado HLS对其中耗时较多的循环进行了优化,并且运用了图片分割的思想,将源图片分割成4/8份同时并行运算,以达到利用更多资源换取耗时更短的优化效果,最终实现了Latency的极大提升并且充分利用了HLS所给的资源。很好的解决了算法复杂度过高的问题,基于上述优化思想,小组对源代码进行了较大程度的改写,得到了基于图片规格为512*512的如下优化成果和资源利用率成果。
    在这里插入图片描述
    在这里插入图片描述
    对于上述结果,小组生成了硬件IP,完成了基于ZYNQ开发板的电路搭建,以及对Python测试代码的修改,最终在PYNQ云平台测试成功。

    一、算法描述

    1.1 Sobel滤波

    Sobel算子用了一个3*3的滤波器来对图像进行滤波从而得到梯度图像纵向算子,提取图像水平边缘:

    在这里插入图片描述
    横向算子,提取图像竖直边缘:
    在这里插入图片描述
    用滤波器与图像进行卷积即可。例如,对于原图的灰度图如下
    在这里插入图片描述
    纵向特征提取:
    在这里插入图片描述
    横向梯度提取:
    在这里插入图片描述

    1.2 梯度分解

    将梯度方向量化成四个方向。

    1.3 非最大值抑制

    给出一张图片和上面许多物体检测的候选框(即每个框可能都代表某种物体),但是这些框很可能有互相重叠的部分,我们要做的就是只保留最优的框。 例如,在人脸识别算法中:

    在这里插入图片描述
    已经识别出了 5 个候选框,但是我们只需要最后保留两个人脸。

    在这里插入图片描述

    1.4 hysteresis 滞后

    通过非极大值抑制后,仍然有很多的可能边缘点,进一步的设置一个双阈值,即低阈值(low)、高阈值(high),有如下判断条件:
    1、某一像素的灰度值超过high 阈值, 该像素被保留为边缘像素。
    2、某一像素的灰度值小于low 阈值, 该像素被排除。
    3、如果某一像素的灰度值在两个阈值之间,该像素仅仅在连接到一个高于high阈值的像素时被保留。

    二、优化方案

    2.1优化前

    为了得到可视化的Latency和资源利用信息,我们将图片规格定为512*512(即lena图片大小)用如下代码进行限定:

    assert(rows=512);assert(cols=512);
    

    优化前的Latency信息:

    在这里插入图片描述
    查看详细Latency信息:
    在这里插入图片描述
    由于Sobel滤波和Duplicate均调用了hls的库函数,我们无法对其进一步优化,但是其余部分(上图红色框出部分)可以进行优化。
    优化前的资源利用信息:
    在这里插入图片描述
    我们发现资源利用率极低,可以进行较大程度的优化以利用资源提升速度。

    2.2循环优化

    2.2.1 hysteresis 滞后

    有如下二重循环:
    在这里插入图片描述
    对其进行禁止展开,然后进行流水处理的优化,其中流水线添加enable_flush它实现了一个管道,如果在管道输入时有效的数据不活动,该管道将刷新并清空。rewind它支持倒绕或连续循环流水线,在一个循环迭代结束和下一个迭代开始之间没有停顿。

    最终优化指令如下:

    #pragma HLS LOOP_FLATTEN OFF
    #pragma HLS DEPENDENCE array inter false
    #pragma HLS PIPELINE enable_flush rewind
    

    优化后该函数Latency:

    在这里插入图片描述
    该函数的Latency相比于优化前的在这里插入图片描述性能提升了74.8%

    2.2.2 nonmax_suppression 非最大值抑制

    有如下二重循环:
    在这里插入图片描述

    与上面一样,对其中的二重循环进行禁止展开,然后进行流水处理的优化,其中流水线添加enable_flush它实现了一个管道,如果在管道输入时有效的数据不活动,该管道将刷新并清空。rewind它支持倒绕或连续循环流水线,在一个循环迭代结束和下一个迭代开始之间没有停顿。

    最终优化指令如下:

    #pragma HLS LOOP_FLATTEN OFF
    #pragma HLS DEPENDENCE array inter false
    #pragma HLS PIPELINE enable_flush rewind
    

    优化后该函数的Latency:
    在这里插入图片描述
    该函数的Latency相比于优化前的在这里插入图片描述性能提升了66.5%

    2.2.3 gradient_decomposition(梯度分解)

    有如下二重循环:
    在这里插入图片描述
    与前面两个也一样,对其中的二重循环进行禁止展开,然后进行流水处理的优化,其中流水线添加enable_flush它实现了一个管道,如果在管道输入时有效的数据不活动,该管道将刷新并清空。rewind它支持倒绕或连续循环流水线,在一个循环迭代结束和下一个迭代开始之间没有停顿。

    最终优化指令如下:

    #pragma HLS PIPELINE enable_flush rewind
    #pragma HLS LOOP_FLATTEN OFF
    #pragma HLS DEPENDENCE array inter false
    

    优化后该函数的Latency:
    在这里插入图片描述
    该函数的Latency相比于优化前的在这里插入图片描述性能提升了66.4%

    2.2.4 canny_edge数据读写部

    发现top-function中的数据读写部分有两个循环,我们对其进行优化:
    1
    在这里插入图片描述
    我们对其做流水线优化:
    添加流水线指令:

    #pragma HLS PIPELINE enable_flush rewind
    

    优化结果:
    在这里插入图片描述
    在这里插入图片描述
    此处Latency对于优化前在这里插入图片描述性能提升了20.0%

    2.2.5 循环优化成果

    在经过上述对循环优化后,我们得到了如下Latency结果:
    在这里插入图片描述
    得到了如下资源利用成果:
    在这里插入图片描述
    小组对此结果并不满意,我们可以发现,上述资源利用率是非常低的,可以把剩下的资源尽可能地都利用起来,以达到进一步的优化效果。于是小组在此基础上探索新的优化方式。

    2.3 1/4图片分割优化

    2.3.1 瓶颈

    结束了循环优化,我们尝试了很多种优化方案,包括在所有函数中进行inline优化,但是时钟无法使得Latency有再有较大的提升,因为循环优化结束后的各项Latency如下:

    在这里插入图片描述
    我们发现基本上所有函数的Latency都趋近与26万了,由于Sobel滤波和Duplicate都是调用了内部函数,而其Latency一开始就固定到26万了,再进行其他优化也无法减少总的Latency。

    那么还有什么方案可以进一步产生巨大优化呢?

    2.3.2 并行计算思想

    观察我们的资源利用:

    在这里插入图片描述
    资源利用是很少的,还有很大的优化空间。

    那么什么方案能充分利用资源呢?
    此时我们想到了并行计算的思想,我们计划将图片分割成四部分同时跑这个算法。
    分割详情如下:
    在这里插入图片描述

    2.3.3 代码层面的并行修改方案

    修改原有的代码:(完整代码请看源文件)
    额外增加3个输入端口:

    void canny_edge(wide_stream* in_stream1, wide_stream* out_stream1, 
    		wide_stream* in_stream2, wide_stream* out_stream2,
    		wide_stream* in_stream3, wide_stream* out_stream3,
    		wide_stream* in_stream4, wide_stream* out_stream4,
    		ap_uint<32> rows, ap_uint<32> cols, int threshold1, int threshold2)
    #pragma HLS INTERFACE axis port=in_stream1 bundle=INPUT
    #pragma HLS INTERFACE axis port=out_stream1 bundle=OUTPUT
    #pragma HLS INTERFACE axis port=in_stream2 bundle=INPUT
    #pragma HLS INTERFACE axis port=out_stream2 bundle=OUTPUT
    #pragma HLS INTERFACE axis port=in_stream3 bundle=INPUT
    #pragma HLS INTERFACE axis port=out_stream3 bundle=OUTPUT
    #pragma HLS INTERFACE axis port=in_stream4 bundle=INPUT
    #pragma HLS INTERFACE axis port=out_stream4 bundle=OUTPUT
    

    各类资源也增加三倍:
    如:

    GRAY_IMAGE src_bw1(rows, cols);
    GRAY_IMAGE src_bw2(rows, cols);
    GRAY_IMAGE src_bw3(rows, cols);
    GRAY_IMAGE src_bw4(rows, cols);
    

    写入和读出的代码也应增加三倍:
    如:

    for(int r = 0; r < packets; r++){
    #pragma HLS PIPELINE enable_flush rewind
    
    		ap_uint<32> dat1 = in_stream1->data;
    		src_bw1.write(GRAY_PIXEL(dat1.range(7,0)));
    		src_bw1.write(GRAY_PIXEL(dat1.range(15,8)));
    		src_bw1.write(GRAY_PIXEL(dat1.range(23,16)));
    		src_bw1.write(GRAY_PIXEL(dat1.range(31,24)));
    		++in_stream1;
    
    		ap_uint<32> dat2 = in_stream2->data;
    		src_bw2.write(GRAY_PIXEL(dat2.range(7,0)));
    		src_bw2.write(GRAY_PIXEL(dat2.range(15,8)));
    		src_bw2.write(GRAY_PIXEL(dat2.range(23,16)));
    		src_bw2.write(GRAY_PIXEL(dat2.range(31,24)));
    		++in_stream2;
    
    		ap_uint<32> dat3 = in_stream3->data;
    		src_bw3.write(GRAY_PIXEL(dat3.range(7,0)));
    		src_bw3.write(GRAY_PIXEL(dat3.range(15,8)));
    		src_bw3.write(GRAY_PIXEL(dat3.range(23,16)));
    		src_bw3.write(GRAY_PIXEL(dat3.range(31,24)));
    		++in_stream3;
    
    		ap_uint<32> dat4 = in_stream4->data;
    		src_bw4.write(GRAY_PIXEL(dat4.range(7,0)));
    		src_bw4.write(GRAY_PIXEL(dat4.range(15,8)));
    		src_bw4.write(GRAY_PIXEL(dat4.range(23,16)));
    		src_bw4.write(GRAY_PIXEL(dat4.range(31,24)));
    		++in_stream4;
    	}
    

    部分操作的调用也增加三倍:
    如:

    hls::Duplicate( src_bw1, src11, src12 );
    hls::Duplicate( src_bw2, src21, src22 );
    hls::Duplicate( src_bw3, src31, src32 );
    hls::Duplicate( src_bw4, src41, src42 );
    

    2.3.4 图片分割(1/4)优化成果

    在经过一系列调试和代码修改后,按照一张图片分割成4部分,我们得到了如下Latency结果:
    在这里插入图片描述
    得到了如下资源利用成果:
    在这里插入图片描述
    可以发现,Latency相比于前面的循环优化后的53万有极大的缩减,变成了现在的14万,此结果得力于四部分并行优化。当然,我们也消耗了更多的资源,
    其中LUT我们的使用率达到了55%

    但是,当我们看到了这样的资源利用,我们发现仍存在一定的优化空间,还可以进一步利用资源,那么能不能将图片进一步分割呢?

    2.4 1/8图片分割优化

    2.4.1 图片分割(1/8)优化成果

    按照上面代码修改方案,进一步改进,我们把一张图片分成了八份并行运算
    分割方式如下:
    在这里插入图片描述
    得到如下Latency结果:
    在这里插入图片描述
    得到了如下资源利用成果:
    在这里插入图片描述

    2.5 优化结果对比分析

    经过上述优化我们得到了如下Latency结果对比:
    在这里插入图片描述
    得到了如下资源利用率对比:
    在这里插入图片描述
    结果分析:
    在循环优化的基础上进行越精细的图片分割的代码级并行优化可以实现Latency的极大提升,同时又充分利用了给的资源。同时,可以发现,当进行1/8分割后,资源LUT的利用率已经达到93%,所以无法再进行进一步分割了。

    三、PYNQ云平台测试

    声明:由于电路复杂性,这里以1/4图片分割优化结果为例。

    3.1 各部件连线图

    由于增加了3个输入输出端口,连线比较复杂:

    在这里插入图片描述

    3.2 Python代码修改

    由于多了3个输入端口,我们对Python测试代码也要进行修改:
    (只粘贴部分,完整代码请参考源文件)
    增加声明的dma数量:

    dma1 = CannyEdge_design.axi_dma_0
    dma2 = CannyEdge_design.axi_dma_1
    dma3 = CannyEdge_design.axi_dma_2
    dma4 = CannyEdge_design.axi_dma_3
    

    增加输入输出流:

    in_buffer1 = xlnk.cma_array(shape=(256, 256), dtype=np.uint8)
    out_buffer1 = xlnk.cma_array(shape=(256, 256), dtype=np.uint8)
    in_buffer2 = xlnk.cma_array(shape=(256, 256), dtype=np.uint8)
    out_buffer2 = xlnk.cma_array(shape=(256, 256), dtype=np.uint8)
    in_buffer3 = xlnk.cma_array(shape=(256, 256), dtype=np.uint8)
    out_buffer3 = xlnk.cma_array(shape=(256, 256), dtype=np.uint8)
    in_buffer4 = xlnk.cma_array(shape=(256, 256), dtype=np.uint8)
    out_buffer4 = xlnk.cma_array(shape=(256, 256), dtype=np.uint8)
    

    拷贝修改:

    np.copyto(in_buffer1,input_array[0:256,0:256])
    np.copyto(in_buffer2,input_array[256:512,256:512])
    np.copyto(in_buffer3,input_array[0:256,256:512])
    np.copyto(in_buffer4,input_array[256:512,0:256])
    #in_buffer.nbytes = input_array.nbytes
    buf_image1 = Image.fromarray(in_buffer1)
    buf_image2 = Image.fromarray(in_buffer2)
    buf_image3 = Image.fromarray(in_buffer3)
    buf_image4 = Image.fromarray(in_buffer4)
    

    数据传输:

    dma1.sendchannel.transfer(in_buffer1)
    dma1.recvchannel.transfer(out_buffer1)
    dma2.sendchannel.transfer(in_buffer2)
    dma2.recvchannel.transfer(out_buffer2)  
    dma3.sendchannel.transfer(in_buffer3)
    dma3.recvchannel.transfer(out_buffer3)  
    dma4.sendchannel.transfer(in_buffer4)
    dma4.recvchannel.transfer(out_buffer4) 
    

    3.3 平台测试结果

    由于我们用的是512*512的图片格式进行优化的,所以测试我们就用lena
    我们分四份输入输出:
    输入:
    在这里插入图片描述
    在这里插入图片描述
    输出:
    在这里插入图片描述

    在这里插入图片描述
    最后我们用Python把四部分图片拼接到一起:
    在这里插入图片描述
    测试结果分析
    利用python将图片分为四份分别输入主函数的四个端口,成功的得到了边缘分割后的各部分图像,用python将四部分拼接在一起,得到完整的图像。此次优化成功。
    但是,可能是python图像拼接函数的问题,无法将四张图像严丝合缝地拼接在一起,这一点尚有遗憾。

    四、心得体会

    4.1组员一心得:

    实验方面
    这次的优化实验可以说是非常考验我的自主学习和思维拓展能力的,其实一开始做这个优化是很迷茫的,发现优化上限是二重循环数据量512*512≈26万,发现对所有循环加上pipeline基本就可以达到这个极限了,加上可能是数据写入和计算不能并行处理的缘故,那么Latency极限就是52万左右。
    后来听了老师上课讲的可以通过分割图片的方法,思路一下子就拓展了,然后进行了代码的修改和器件连接的修改,最终把一开始的105万Latency优化到了6万,也充分利用了给的资源。
    所以,在这次实验中,我学到了在遇到瓶颈的时候要懂得寻找新方法。
    课程方面
    对于可重构计算这门课程的理解,我个人觉得这是我们目前为止,或者说是本科阶段,学得最靠近计算机科学前言的东西了,是非常贴近实际的,而正是因为它贴近实际这一特点,往往一些问题没有特定的答案,这就要利用我们自身的思考去解决实际问题了。当然,在本学期的可重构计算这门课程中,我也学到了很多关于FPGA的知识,还有基础的神经网络知识,通过一次次的实验,让我学到了如何制作,或者说是进行一次FPGA的算法优化。

    4.2组员二心得:

    对图像处理的边缘检测算法、Sobel滤波、梯度分解、非最大值抑制有了一定的了解。
    循环优化是以往实验做过的,但结合了图片分割思想后优化效果有了显著提升。提醒我们不要囿于固有的思路,在想法上能够大胆创新。

    4.3组员三心得:

    通过查阅资料和阅读代码学习了canny图像边缘检测算法,了解到这是一种非常优秀的边缘检测算法,拓宽了对于算法学习的视野;经过添加各类优化指令来尝试对程序的加速,提高了自己对各种优化指令的理解,也清楚了各种类型优化指令对于性能的提升效果;遇到优化瓶颈后也思考了很多,也一度很茫然,不过在听了老师课上的讲的图片分割方法后,一位队友就根据这个方法尝试了图片分割,最后在我们已有优化的基础上又提升了好几倍,我们对于优化也有了更进一步的认识,不能困在一种思维方式下,解决问题的角度可以有很多种。
    对于可重构的理解
    因为计算机的架构对于其处理能力有着至关重要的影响,不会存在一种对所有运算任务都是最优解的计算机架构。可重构就是一种灵活的架构来解决不同任务有其最合适架构的问题,可重构计算有硬件设计可基于软件设计的灵活性,并且运算能力和功耗也都有很大的改进。就像比较简单的pipeline循环优化,按照原来的硬件结构,在for循环中,只有在完成一个循环后才能开始下一个循环,但是加入了pipeline循环优化指令后,这两个循环就可以并行计算,提高运行速度。

    五、参考文献

    [1]rrr2.HLS for 循环优化其他方法[EB/OL].https://blog.csdn.net/qq_35608277/article/details/104650513,2020-03-04.
    [2]许进进.边缘检测算法 之 Canny边缘检测算法的实现[EB/OL].https://blog.csdn.net/LucasXu01/article/details/90764559,2019-06-04.
    [3]豆沙粽子好吃嘛!.xilinx 暑期学校学习笔记(Day 6) Vitis及PYNQ-Z2上的Canny边缘提取[EB/OL].https://blog.csdn.net/kzz6991/article/details/107580643,2020-07-25.
    [4]jzj1993.Xilinx Vivado的使用详细介绍(1):创建工程、编写代码、行为仿真、Testbench[EB/OL].https://blog.csdn.net/jzj1993/article/details/45533729,2015-05-06.
    [5]谭检成,吴定 祥,李明鑫 ,等.基于 Vivado HLS 的 Canny 算法实时加速设计[J].嵌入式技术,2018,44(9):59-62.

    源代码下载地址

    展开全文
  • 预处理、边缘提取、车牌定位、字符分割、字符识别五大模块①正确地分割文字图像区域;②正确的分离单个文字;③正确识别单个字符。用MATLAB软件编程来实现每一个部分,最后识别出汽车牌照。
  • 代码精简、升级后的带框架Canny算法程序
  • MATLAB中canny算子边缘检测

    万次阅读 多人点赞 2018-11-22 08:46:22
    Canny的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测- 算法能够尽可能多地标识出图像中的实际边缘。 好的定位- 标识出的边缘要与实际图像中的实际边缘尽可能接近。 最小响应- 图像中的...
  • 摘 要 在图象边缘检测中往往要求所检测到的边缘具有封闭特性,本文详细地分析了目前常用的两种算法:哈夫变换和Canny边缘检测算法,最后,探讨边缘算子应满足的准则。关键词 边缘检测;闭合性;哈夫变换;Canny算子1...
  • Vivado Hls Opencv Canny

    2020-01-15 11:55:21
    1、根据VIVADO HLS U96 opencv这篇博客,新建canny工程,将…\xfopencv_master\examples中canny文件夹中的源文件复制到新建工程中。 2、修改个别文件 (1)xf_canny_config.h头文件中 ,修改图片的宽和高,为了快速...
  • MATLAB图像处理专栏--边缘检测算法,包含Sobel、Prewitt、Canny、Roberts算子。保证源代码的运行,GUI界面更加便于对比原图与效果图以及保存。
  • canny检测matlab代码Canny边缘检测算法的FPGA加速 Canny边缘检测算法是一种多阶段算法,可检测图像中...用于算法软件实现的CPP代码位于CPP目录中。 用于将图像转换为文本(反之亦然)的MATLAB脚本位于MATLAB目录中。
  • Canny算法详解(转)

    千次阅读 2010-01-14 17:30:00
    Canny算法详解(转)边缘提取以及边缘增强是不少图像处理软件都具有的基本功能,它的增强效果很明显,在用于识别的应用中,图像边缘也是非常重要的特征之一。图像边缘保留了原始图像中相当重要的部分信息,而又使得总...
  • 数字图像处理综合实验报告 一、Canny边缘检测 我们可以直接使用一阶导数...Canny算法并不是简单地使用某个卷积核来过滤图像,而是有一套步骤的,Canny算法的步骤大致可以分为如下四步: 高斯滤波(降低噪声,防止虚假
  • 用python编程语言,用OpenCV实现以下功能: 1.图像采集、输入和显示 2.软件界面的搭建 ...4.功能包括:canny边缘检测,角点检测(界面分别显示自己所写算法处理结果和OpenCV的算法处理结果,做对比)。
  • 首先利用帧间差分法和Canny边缘检测法分割出运动目标的完整区域,然后用提取出的目标区域初始化Camshift算法的初始搜索窗口,从而实现了目标的自动跟踪。当背景中存在相似颜色干扰或者目标被严重遮挡时,采用Kalman...
  • OpenCV 的Canny算法的理解

    千次阅读 2013-09-16 11:32:47
    1.Canny边缘检测基本原理  (1)图象边缘检测必须满足两个条件:一能有效地抑制噪声;二必须尽量精确确定边缘的位置。  (2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子。这就是Canny边缘检测算子。  ...
  • 利用数学形态学操作方法先对视频图像进行处理,然后利用优选出的Canny算子对行人图像进行边缘检测,再使用曲线拟合技术对行人轮廓进行加工,获取完整的行人轮廓曲线,为行人识别与跟踪奠定坚实的基础。试验结果表明...
  • 基于STM32H7的图像处理–canny边缘检测(一) ** 最近在用STM32H7这块板子做机器视觉的学习,在这里记录下学习心得与过程。本人初学者,有不对的地方欢迎大家指正。 边缘是图像的基本特征,图像的边缘通常意味着一个...
  • (转载)canny算法

    2010-07-10 22:33:00
    http://blog.verycd.com/ari/showentry=54014 边缘提取以及边缘增强是不少图像处理软件都具有 的基本功能,它的增强效果很明显,在用于识别的应用中,图像边缘也是非常重要的特征之一。图像边缘保留了原始图像中相当...
  • 这是使用蚁群算法的边缘检测器。 它还包括Canny,Sobel,Laplace方法。 whypro@live.com
  • Canny详解(转载)

    千次阅读 2013-11-22 10:36:26
    图象边缘检测中边界闭合性...摘 要 在图象边缘检测中往往要求所检测到的边缘具有封闭特性,本文详细地分析了目前常用的两种算法:哈夫变换和Canny边缘检测算法,最后,探讨边缘算子应满足的准则。 关键词 边缘检测;闭
  • canny算子的理论分析 .

    万次阅读 2016-04-01 11:44:15
    摘 要 在图象边缘检测中往往要求所检测到的边缘具有封闭特性,本文详细地分析了目前常用的两种算法:哈夫变换和Canny边缘检测算法,最后,探讨边缘算子应满足的准则。 关键词 边缘检测;闭合性;哈夫变换;Canny...
  • CAN波特率计算软件.rar

    2021-03-18 12:00:36
    对于开发单片机can总线不可缺少的辅助工具软件
  • 在空间域上,通过Canny边缘检测算子获得初步的运动目标边缘轮廓,利用图像金字塔的多分辨特性排除背景噪声,经过一定运算再次得到运动目标。将两次得到的运动目标作“与运算”,提取出最终的运动目标。实验结果表明...
  • canny边缘检测及matlab实现》由会员分享,可在线阅读,更多相关《canny边缘检测及matlab实现(8页珍藏版)》请在人人文库网上搜索。1、北京工业大学研究生课程考试答题纸题号分数任课教师签名一二三四五六七八九十...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,256
精华内容 502
关键字:

canny算法软件

友情链接: rv472.zip