python+opencv利用canny算法进行图像边缘检测(附代码)

版权声明:本文为博主原创文章,转载请附源链接。


Canny边缘检测算法是一种很流行的边缘检测算法,是John F.Canny在1986年提出来的。

Canny边缘检测算法其步骤有如下四步:

1、由于边缘检测算法受到噪声的影响较大,首先第一步必须对图像进行去噪,利用前面讲的高通滤波器进行去噪;

2、第二步和是利用第一步中的高通滤波器得到图像的梯度,大小和方向;(具体见图1)

python+opencv利用canny算法进行图像边缘检测(附代码)_第1张图片 图1

3、在第二步中获得图像梯度之后,对整幅图像进行扫描;去除那些非边界上的梯度较大的点;(见图2)

python+opencv利用canny算法进行图像边缘检测(附代码)_第2张图片 图2 绿色部分为物体,B点和C点为非边界上的点,进行去除。

 4、设置两个阈值,maxVal和minVal。梯度大于maxVal的一定为边缘点,图像梯度小于minVal一定是非边缘点,应剔除;图像梯度在minVal—maxVal中间的可能是边缘点,也可能是非边缘点,再根据下图进行判断(见图3);

python+opencv利用canny算法进行图像边缘检测(附代码)_第3张图片 图3

 如上图所示A点高于maxVal ,所以A是边缘点,B点与C点均在minVal—maxVal中间,但是C点与 A(边缘点)相连,所以也C点也是边缘点。 B点没有与边缘点相连,所以B点被剔除;



cv2.Canny()函数参数说明

在opencv中Canny算法通过cv2.Canny()函数实现。

其第一个参数是原图像;第二个和第三个参数分别是两个阈值,minVal 和 maxVal;第三个参数是设置卷积和的大小,默认是3,(即与3*3的矩阵进行卷积),最后一个参数是设置求梯度大小的方程L2gradient,参数可选择True,则会用图1方程进行梯度计算,默认值为False,则用图4中方程进行计算梯度;

图4

示例附代码如下所示:

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

img=cv2.imread('4.jfif',0) #原图为彩色图,可将第二个参数变为0,为灰度图

edges = cv2.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('yuan tu'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Canny bianyuanjiance'), plt.xticks([]), plt.yticks([])
plt.show()

 运行结果如下:

python+opencv利用canny算法进行图像边缘检测(附代码)_第4张图片 Canny算子进行边缘检测

你可能感兴趣的:(opencv)