0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是边缘检测?边缘检测的算法由来

新机器视觉 来源:AI公园 作者:ANKIT SACHAN 2021-03-12 10:00 次阅读

导读

分析了Canny的优劣,并给出了OpenCV使用深度学习做边缘检测的流程,文末有代码链接。

在这篇文章中,我们将学习如何在OpenCV中使用基于深度学习的边缘检测,它比目前流行的canny边缘检测器更精确。边缘检测在许多用例中是有用的,如视觉显著性检测,目标检测,跟踪和运动分析,结构从运动,3D重建,自动驾驶,图像到文本分析等等。

什么是边缘检测?

边缘检测是计算机视觉中一个非常古老的问题,它涉及到检测图像中的边缘来确定目标的边界,从而分离感兴趣的目标。最流行的边缘检测威廉希尔官方网站 之一是Canny边缘检测,它已经成为大多数计算机视觉研究人员和实践者的首选方法。让我们快速看一下Canny边缘检测。

Canny边缘检测算法

1983年,John Canny在麻省理工学院发明了Canny边缘检测。它将边缘检测视为一个信号处理问题。其核心思想是,如果你观察图像中每个像素的强度变化,它在边缘的时候非常高。

在下面这张简单的图片中,强度变化只发生在边界上。所以,你可以很容易地通过观察像素强度的变化来识别边缘。

现在,看下这张图片。强度不是恒定的,但强度的变化率在边缘处最高。(微积分复习:变化率可以用一阶导数(梯度)来计算。)

Canny边缘检测器通过4步来识别边缘:

去噪:因为这种方法依赖于强度的突然变化,如果图像有很多随机噪声,那么会将噪声作为边缘。所以,使用5×5的高斯滤波器平滑你的图像是一个非常好的主意。

梯度计算:下一步,我们计算图像中每个像素的强度的梯度(强度变化率)。我们也计算梯度的方向。

梯度方向垂直于边缘,它被映射到四个方向中的一个(水平、垂直和两个对角线方向)。

非极大值抑制:现在,我们想删除不是边缘的像素(设置它们的值为0)。你可能会说,我们可以简单地选取梯度值最高的像素,这些就是我们的边。然而,在真实的图像中,梯度不是简单地在只一个像素处达到峰值,而是在临近边缘的像素处都非常高。因此我们在梯度方向上取3×3附近的局部最大值。

迟滞阈值化:在下一步中,我们需要决定一个梯度的阈值,低于这个阈值所有的像素都将被抑制(设置为0)。而Canny边缘检测器则采用迟滞阈值法。迟滞阈值法是一种非常简单而有效的方法。我们使用两个阈值来代替只用一个阈值:

高阈值 = 选择一个非常高的值,这样任何梯度值高于这个值的像素都肯定是一个边缘。

低阈值 = 选择一个非常低的值,任何梯度值低于该值的像素绝对不是边缘。

在这两个阈值之间有梯度的像素会被检查,如果它们和边缘相连,就会留下,否则就会去掉。

迟滞阈值化

Canny 边缘检测的问题:

由于Canny边缘检测器只关注局部变化,没有语义(理解图像的内容)理解,精度有限(很多时候是这样)。

Canny边缘检测器在这种情况下会失败,因为没有理解图像的上下文

语义理解对于边缘检测是至关重要的,这就是为什么使用机器学习或深度学习的基于学习的检测器比canny边缘检测器产生更好的结果。

OpenCV中基于深度学习的边缘检测

OpenCV在其全新的DNN模块中集成了基于深度学习的边缘检测威廉希尔官方网站 。你需要OpenCV 3.4.3或更高版本。这种威廉希尔官方网站 被称为整体嵌套边缘检测或HED,是一种基于学习的端到端边缘检测系统,使用修剪过的类似vgg的卷积神经网络进行图像到图像的预测任务。

HED利用了中间层的输出。之前的层的输出称为side output,将所有5个卷积层的输出进行融合,生成最终的预测。由于在每一层生成的特征图大小不同,它可以有效地以不同的尺度查看图像。

网络结构:整体嵌套边缘检测

HED方法不仅比其他基于深度学习的方法更准确,而且速度也比其他方法快得多。这就是为什么OpenCV决定将其集成到新的DNN模块中。以下是这篇论文的结果:

在OpenCV中训练深度学习边缘检测的代码

OpenCV使用的预训练模型已经在Caffe框架中训练过了,可以这样加载:

sh download_pretrained.sh

网络中有一个crop层,默认是没有实现的,所以我们需要自己实现一下。

class CropLayer(object):

def __init__(self, params, blobs):

self.xstart = 0

self.xend = 0

self.ystart = 0

self.yend = 0

# Our layer receives two inputs. We need to crop the first input blob

# to match a shape of the second one (keeping batch size and number of channels)

def getMemoryShapes(self, inputs):

inputShape, targetShape = inputs[0], inputs[1]

batchSize, numChannels = inputShape[0], inputShape[1]

height, width = targetShape[2], targetShape[3]

self.ystart = (inputShape[2] - targetShape[2]) // 2

self.xstart = (inputShape[3] - targetShape[3]) // 2

self.yend = self.ystart + height

self.xend = self.xstart + width

return [[batchSize, numChannels, height, width]]

def forward(self, inputs):

return [inputs[0][:,:,self.ystart:self.yend,self.xstart:self.xend]]

现在,我们可以重载这个类,只需用一行代码注册该层。

cv.dnn_registerLayer(‘Crop’, CropLayer)

现在,我们准备构建网络图并加载权重,这可以通过OpenCV的dnn.readNe函数。

net = cv.dnn.readNet(args.prototxt, args.caffemodel)

现在,下一步是批量加载图像,并通过网络运行它们。为此,我们使用cv2.dnn.blobFromImage方法。该方法从输入图像中创建四维blob。

blob = cv.dnn.blobFromImage(image, scalefactor, size, mean, swapRB, crop)

其中:

image:是我们想要发送给神经网络进行推理的输入图像。

scalefactor:图像缩放常数,很多时候我们需要把uint8的图像除以255,这样所有的像素都在0到1之间。默认值是1.0,不缩放。

size:输出图像的空间大小。它将等于后续神经网络作为blobFromImage输出所需的输入大小。

swapRB:布尔值,表示我们是否想在3通道图像中交换第一个和最后一个通道。OpenCV默认图像为BGR格式,但如果我们想将此顺序转换为RGB,我们可以将此标志设置为True,这也是默认值。

mean:为了进行归一化,有时我们计算训练数据集上的平均像素值,并在训练过程中从每幅图像中减去它。如果我们在训练中做均值减法,那么我们必须在推理中应用它。这个平均值是一个对应于R, G, B通道的元组。例如Imagenet数据集的均值是R=103.93, G=116.77, B=123.68。如果我们使用swapRB=False,那么这个顺序将是(B, G, R)。

crop:布尔标志,表示我们是否想居中裁剪图像。如果设置为True,则从中心裁剪输入图像时,较小的尺寸等于相应的尺寸,而其他尺寸等于或大于该尺寸。然而,如果我们将其设置为False,它将保留长宽比,只是将其调整为固定尺寸大小。

在我们这个场景下:

inp = cv.dnn.blobFromImage(frame, scalefactor=1.0, size=(args.width, args.height),

mean=(104.00698793, 116.66876762, 122.67891434), swapRB=False,

crop=False)

现在,我们只需要调用一下前向方法。

net.setInput(inp)

out = net.forward()

out = out[0, 0]

out = cv.resize(out, (frame.shape[1], frame.shape[0]))

out = 255 * out

out = out.astype(np.uint8)

out=cv.cvtColor(out,cv.COLOR_GRAY2BGR)

con=np.concatenate((frame,out),axis=1)

cv.imshow(kWinName,con)

结果:

中间的图像是人工标注的图像,右边是HED的结果

中间的图像是人工标注的图像,右边是HED的结果

文中的代码:

https://github.com/sankit1/cv-tricks.com/tree/master/OpenCV/Edge_detection

英文原文:https://cv-tricks.com/opencv-dnn/edge-detection-hed/
编辑:lyn

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 边缘检测
    +关注

    关注

    0

    文章

    92

    浏览量

    18204
  • 计算机视觉
    +关注

    关注

    8

    文章

    1696

    浏览量

    45952
  • 深度学习
    +关注

    关注

    73

    文章

    5497

    浏览量

    121068

原文标题:在OpenCV中基于深度学习的边缘检测

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    边缘计算与边缘设备的关系

    边缘计算与边缘设备之间存在着密切的关系,它们是相互依存、相互促进的。以下是对这两者关系的介绍: 一、定义与功能 边缘计算 边缘计算是一种分布式计算概念,它将智能集成到
    的头像 发表于 10-24 14:33 297次阅读

    利用VLIB在TMS320C64x/64x+上实现Canny边缘检测

    电子发烧友网站提供《利用VLIB在TMS320C64x/64x+上实现Canny边缘检测.pdf》资料免费下载
    发表于 10-14 11:13 0次下载
    利用VLIB在TMS320C64x/64x+上实现Canny<b class='flag-5'>边缘</b><b class='flag-5'>检测</b>

    基于 DSP5509 进行数字图像处理中 Sobel 算子边缘检测的硬件连接电路图

    )将图像数据传输到 DSP5509。 DSP5509 处理器:作为核心处理单元,负责接收图像数据、执行 Sobel 算子边缘检测算法,并输出处理后的结果。 存储模块:包括 RAM 和 Flash。RAM
    发表于 09-25 15:25

    使用边缘AI和Sitara处理器进行关键字检测

    电子发烧友网站提供《使用边缘AI和Sitara处理器进行关键字检测.pdf》资料免费下载
    发表于 09-02 11:30 0次下载
    使用<b class='flag-5'>边缘</b>AI和Sitara处理器进行关键字<b class='flag-5'>检测</b>

    DSP国产教学实验箱_实验案例_操作教程:5-11 边缘检测

    检测算法是具有严格定义的、可以提供良好可靠检测的方法之一。由于它具有满足边缘检测的三个标准和实现过程简单的优势,成为边缘
    发表于 07-19 10:38

    图像边缘检测系统的设计流程

    图像边缘检测系统的设计流程是一个涉及多个步骤的复杂过程,它旨在从图像中提取出重要的结构信息,如边界、轮廓等。这些边缘信息对于图像分析、机器视觉、图像压缩等领域至关重要。以下是一个详细的图像边缘
    的头像 发表于 07-17 16:39 333次阅读

    图像识别算法都有哪些方法

    传统方法和基于深度学习的方法。 传统图像识别算法 1.1 边缘检测 边缘检测是图像识别的基础,它用于检测
    的头像 发表于 07-16 11:14 5329次阅读

    opencv图像识别有什么算法

    图像识别算法边缘检测边缘检测是图像识别中的基本步骤之一,用于识别图像中的边缘。常见的
    的头像 发表于 07-16 10:40 927次阅读

    基于FPGA的实时边缘检测系统设计,Sobel图像边缘检测,FPGA图像处理

    摘要 :本文设计了一种 基于 FPGA 的实时边缘检测系统 ,使用OV5640 摄像头模块获取实时的视频图像数据,提取图像边缘信息并通过 VGA显示。FPGA 内部使用流水线设计和 并行运算加速
    发表于 05-24 07:45

    主流边缘AI算法,在安防、零售、交通等领域的应用

    边缘AI可以应用在哪些场景实现哪些功能。   市面上主流的边缘AI算法应用   目前市面上比较主流的边缘AI算法应用,包括人脸及关键点
    的头像 发表于 05-13 01:56 2942次阅读

    算法系列:基于 FPGA 的图像边缘检测系统设计(sobel算法

    )为边缘点。 用的是边缘检测算法。 难点: (1)掌握了 3*3 像素阵列,Gx 与 Gy 就很好计算了。 注意问题:为了避免计算过程中出现负值,所以将正负值分开单独计算,具体见代码
    发表于 03-26 16:40

    什么是边缘计算,边缘计算有哪些应用?

    什么是边缘计算,边缘计算有哪些应用? 边缘计算是一种将计算能力移动到离数据源和终端设备更近的位置的计算模型。它利用边缘设备(如路由器、交换机、物联网设备等)上的计算资源,对数据进行处理
    的头像 发表于 01-09 11:29 1814次阅读

    边缘计算和边缘智能计算区别

    边缘计算和边缘智能计算是两个相关但不同的概念。边缘计算指的是数据处理和存储在靠近数据源的边缘设备上进行,而不是在远程云服务器上进行。边缘智能
    的头像 发表于 12-27 15:28 1037次阅读

    OpenCV边缘检测算子Laplace、LoG详解

    一阶导数算子(例如 Sobel 算子)通过对图像求导来确定图像的边缘,数值绝对值较高的点对应了图像的边缘。如果继续求二阶导,原先数值绝对值较高的点对应了过零点。因此,也可以通过找到二阶导数的过零点来检测
    的头像 发表于 12-21 16:34 2115次阅读
    OpenCV<b class='flag-5'>边缘</b><b class='flag-5'>检测</b>算子Laplace、LoG详解

    国产嵌入式实验箱操作教程_创龙教仪:5-12 边缘检测(LCD显示)

    ,Canny边缘检测算法是具有严格定义的、可以提供良好可靠检测的方法之一。由于它具有满足边缘检测的三个标准和实现过程简单的优势,成为
    发表于 12-14 14:09