Python,Opencv cv2.Canny()边缘检测

Posted 程序媛一枚~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python,Opencv cv2.Canny()边缘检测相关的知识,希望对你有一定的参考价值。

Python,Opencv的Canny边缘检测

这篇博客将介绍Canny边缘检测的概念,并利用cv2.Canny()实现边缘检测;

  • Canny边缘检测是一种流行的边缘检测算法。它是由约翰F开发的,是一个多阶段的算法;
  • Canny边缘检测大致包含4个步骤:
  1. 降噪(使用高斯滤波去除高频噪声);
  2. 计算边缘梯度和方向(SobelX、SobleY核在水平方向和垂直方向对平滑后的图像进行滤波,找到每个像素的边缘梯度和方向);
  3. 非最大抑制(在得到梯度大小和方向后,对图像进行全扫描,去除任何不需要的像素,这些像素可能不构成边缘。检查像素是否在其梯度方向的邻域中是局部最大值。否则,将被抑制(归零)。简而言之,得到的结果是一个具有“细边”的二值图像。
  4. 滞后阈值(决定哪些边是真正的边,哪些不是。为此需要两个阈值minVal和maxVal,任何强度梯度大于maxVal的边都肯定是边,小于minVal的边肯定是非边,因此丢弃。位于这两个阈值之间的边根据其连通性被分类为边或非边。如果它们连接到“确定边缘”像素,则它们被视为边缘的一部分。否则,它们也会被丢弃。)

选择滞后阈值minVal和maxVal是得到正确结果的关键。

1. 效果图

原始图 VS Canny检测效果图如下:
在这里插入图片描述

2. 源码

# Canny边缘检测是一种流行的边缘检测算法。它是由约翰F开发的,是一个多阶段的算法;
# Canny边缘检测大致包含4个步骤:
# 
# 1.降噪(使用高斯滤波去除高频噪声);
# 2. 计算边缘梯度和方向(SobelX、SobleY核在水平方向和垂直方向对平滑后的图像进行滤波,找到每个像素的边缘梯度和方向);
# 3. 非最大抑制(在得到梯度大小和方向后,对图像进行全扫描,去除任何不需要的像素,这些像素可能不构成边缘。检查像素是否在其梯度方向的邻域中是局部最大值。否则,将被抑制(归零)。简而言之,得到的结果是一个具有“细边”的二值图像。
# 4. 滞后阈值(决定哪些边是真正的边,哪些不是。为此需要两个阈值minVal和maxVal,任何强度梯度大于maxVal的边都肯定是边,小于minVal的边肯定是非边,因此丢弃。位于这两个阈值之间的边根据其连通性被分类为边或非边。如果它们连接到“确定边缘”像素,则它们被视为边缘的一部分。否则,它们也会被丢弃。)
# 
# 选择滞后阈值minVal和maxVal是得到正确结果的关键。
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('zly.jpg', 0)
edges = cv2.Canny(img, 80, 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()

参考

以上是关于Python,Opencv cv2.Canny()边缘检测的主要内容,如果未能解决你的问题,请参考以下文章

openCV Canny 边缘检测改进

OpenCV中Canny边缘检测和霍夫变换的讲解与实战应用(附Python源码)

使用 Python OpenCV 检测图像中的对象位置

opencv入门项目——车道线检测

opencv 和 python - 激光曲线检测

Canny 边缘检测