python opencv入门 Canny边缘检测(15)

内容来自OpenCV-Python Tutorials 自己翻译整理

目标

边缘检测的概念
opencv的函数cv2.Canny()

原理
Canny边缘检测很流行,在1986年提出

去除噪声
边缘检测容易受到噪声影响,一般第一步都是用5*5的高斯滤波器去除噪声

计算图像梯度

对平滑后的图像使用sobel算子在水平与竖直方向上计算一阶导数,得到图像梯度(Gx和Gy)。根据梯度图找到边界梯度和方向,公式如下:
这里写图片描述

梯度方向一般与边界垂直,有四类:垂直、水平、两个对角线。

非极大值抑制

获得图像梯度方向和大小以后,需要对全图像进行扫描去除不属于边界的点。
检查每一个像素,看此像素是否是周围具有相同梯度方向中最大的
这里写图片描述

A点在边界上(垂直方向),梯度方向是边界的法向量。点B和点C在梯度方向上面,所以点A检测点B和C是否形成了本地最大值,如果形成最大自,那么久进行下一步,否则进行抑制(赋值为0)
简单的说,得到了二值图像的边界。

滞后阈值
现在需要确定哪些边界是真正的边界,需要两个阈值,minVal和maxVal。图像灰度梯度 高于maxVal被认为是真正的边界,低于minVal的舍弃。两者之间的值要判断是否与真正的边界相连,相连就保留,不相连舍弃。
这里写图片描述
A高于maxVal,是真正边界。C低于maxVal,但是与真正边界相连,也认为是真正边界。B没有和真正阈值相连,而且低于maxVal,抛弃。

opencv使用canny

cv2.Canny()函数,第一个参数是输入图像,第二个和第三个参数是minVal和maxVal
函数原型是这样的

edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])

apertureSize 为卷积核大小
L2gradient 参数设定求梯度大小的方程

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('3.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()

这里写图片描述

练习
添加滚动条

import cv2
import numpy as np
from matplotlib import pyplot as plt

def nothing(x):
    pass

cv2.namedWindow('res')

cv2.createTrackbar('max','res',0,255,nothing)
cv2.createTrackbar('min','res',0,255,nothing)

img = cv2.imread('1.jpg',0)

maxVal=200
minVal=100

while (1):
    
    if cv2.waitKey(20) & 0xFF==27:
        break
    maxVal = cv2.getTrackbarPos('min','res')
    minVal = cv2.getTrackbarPos('max','res')
    if minVal < maxVal:
        edge = cv2.Canny(img,100,200)
        cv2.imshow('res',edge)
    else:
        edge = cv2.Canny(img,minVal,maxVal)
        cv2.imshow('res',edge)
cv2.destoryAllWindows()
  • 14
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值