20180918 坎尼边缘检测(Canny)

用到的函数:cv2.Canny()

canny边缘检测的步骤:

1.噪声去除

边缘检测很容易受到噪声的影响,所以第一步是先用例如5x5的高斯滤波器去除噪声。

2.计算图像梯度

对平滑后的图像使用Sobel算子计算水平方向和竖直方向的一阶导数(Gx和Gy),用这两幅梯度图找到边界的梯度和方向(opencv参考书P91)

梯度的方向一般总是和边界垂直,一般梯度方向归结为四类:垂直、水平、+45°、负45°

3.非极大值抑制

在获得了梯度的方向和大小后,应该对图像做一个扫描,扫描的目的是:去除那些非边界上的点。

对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向中的点中最大的。

具体的解释,参考:https://blog.csdn.net/qq_18234121/article/details/82758721

4.滞后阈值

        设置两个阈值,minVal和maxVal,当图像的梯度值高于maxVal被认为是真的边界,低于minVal的边界被抛弃。而介于两者之间的话,就要看这个点是否与某个被确定为真的边界的点相连。如果是那就认为他也是边界点,否则会被抛弃。

       A 高于阈值maxVal 所以是真正的边界点,C 虽然低于maxVal 但高于minVal 并且与A 相连,所以也被认为是真正的边界点。而B 就会被抛弃,因为他不仅低于maxVal 而且不与真正的边界点相连。所以选择合适的maxVal和minVal 对于能否得到好的结果非常重要。在这一步一些小的噪声点也会被除去,因为我们假设边界都是一些长的线段。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

OPENCV中的坎尼边缘检测:

cv2.Canny(img, minVal, maxVal, Sobel_size, L2gradiation)

img:输入图像,检测边缘的图像

minVal、maxVal:之前提到过的滞后阈值

Sobel_size:设置用来计算图像梯度的Sobel卷积核的大小,默认值为3

L2gradient:它可以用来设定求梯度大小的方程。

如果设为True,就会使用我们上面提到过的方程,否则使用方程: 代替,默认值为False

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

举例:

# -*- coding: utf-8 -*-
"""
@author: LC
"""
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('messi5.jpg',0)
edges = cv2.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()

注意:img是一副灰度图! 结果对比如下:

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值