opencv-python 学习 | canny边缘检测

Canny边缘检测

Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:

1.最优检测:算法能够尽可能多地标识出图像中的实际边缘,漏检真实边缘的概率和误检非边缘的概率都尽可能小;

2.最优定位准则:检测到的边缘点的位置距离实际边缘点的位置最近,或者是由于噪声影响引起检测出的边缘偏离物体的真实边缘的程度最小;

3.检测点与边缘点一一对应:算子检测的边缘点与实际边缘点应该是一一对应。

Canny边缘检测主要分成以下几个步骤:
1.使用高斯滤波器,以平滑图像,滤除噪声。
2.计算图像中每个像素点的梯度强度和方向。
3.应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
4.应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
5.通过抑制孤立的弱边缘最终完成边缘检测。

import cv2
import numpy as np
#显示图像函数
def cv_show(name,img):
    cv2.imshow(name,img)
    while cv2.waitKey(100) != 27:# loop if not get ESC
        if cv2.getWindowProperty(name,cv2.WND_PROP_VISIBLE) <= 0:
            break
    cv2.destroyWindow(name)

Canny函数:
def Canny(image,threshold1,threshold2,edges=None,apertureSize=None,L2gradient=None)

threshold1:int类型的,低阈值
threshold2:int类型的,高阈值
edeges:单通道存储边缘的输出图像
apertureSize:Sobel算子内核(kSize)大小
L2gradiend:Bool类型的,为真表示使用更精确的L2范数进行计算(两个方向的倒数的平方再开放),为假表示用L1范数(直接将两个方向导数的绝对值相加)


img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
v1 = cv2.Canny(img,80,150)
v2 = cv2.Canny(img,50,100)
res = np.hstack((v1,v2))
cv_show('res',res)

当我们改变阈值后,图像后渐渐过滤掉一些背景,当然,重在阈值的选取上,当阈值选大的时候,也是会将图像的特征完全损坏的


你可能感兴趣的:(opencv)