您的位置:首页 > 编程语言 > Python开发

Opencv3.0-python的那些事儿:(七)、Opencv中Canny边缘检测算法使用

2016-06-06 11:57 411 查看
# coding: utf-8

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

'''
19章 Canny边缘检测
步骤:
1噪声去除
使用5*5的高斯滤波器
2计算图像梯度
对平滑后的图像使用Sobel算子计算水平方向和竖直方向的一阶导数(图像梯度)
(Gx和Gy)。根据得到的这两幅梯度图(Gx和Gy)找到边界的梯度和方向,公式如下
Edge_Gradient(G)=sqrt( Gx*Gx + Gy*Gy )

Angle(θ)= tan −1( Gx/Gy)
梯度方向一般总是与边界垂直(?),梯度方向被归为四类:垂直,水平,和两个对角线

3非极大值抑制
获得梯度方向和大小后,对整幅图像做扫描,去除非边界上的点。
对每一个像素检查,看这个点的梯度是不是周围具有相同梯度方向的
点中最大的

4滞后阈值
现在要确定那些边界才是真正的边界。这时我们需要设置两个阈值:
minVal 和 maxVal。当图像的灰度梯度高于 maxVal 时被认为是真的边界,
那些低于 minVal 的边界会被抛弃。如果介于两者之间的话,就要看这个点是
否与某个被确定为真正的边界点相连,如果是就认为它也是边界点,如果不是
就抛弃
'''

def Canny_test():
img = cv2.imread("roi.jpg" , 0)
'''
cv2.Canny(image,threshold1 , threshold2[,edges])
作用:根据Canny算法检测边界
threshold1:minVal,threshold2:maxVal
edges:设置卷积核的大小,L2gradient:默认使用近似值来代替所求的梯度
'''
edges = cv2.Canny(img , 100 , 200)
plt.subplot(1,2,1) , plt.imshow(img , cmap="gray")
plt.title("Original") , plt.xticks([]) , plt.yticks([])
plt.subplot(1,2,2), plt.imshow(edges , cmap="gray")
plt.title("Cannt") , plt.xticks([])  ,plt.yticks([])
plt.show()

if __name__ == "__main__":
Canny_test()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv3.0 Canny