gyro永不抽风！ - CV
type: channel
link: https://gallery.gyrojeff.top/index.php/tag/CV/
items: Canny边缘检测算法（基于OpenCV的Java实现）

Canny边缘检测算法（基于OpenCV的Java实现）
type: item
date: 2020-03-04T16:21:00+00:00
description: Canny边缘检测算法（基于OpenCV的Java实现） 绪论 最近在学习ORB的过程中又仔细学习了Canny，故写下此篇笔记，以作总结。 Canny边缘检测算法的发展历史 Canny边缘检测于1986年由JOHN CANNY首次在论文《A Computational Approach to Edge Detection》中提出，就此拉开了Canny边缘检测算法的序幕。 Canny边缘检测是从不同视觉对象中提取有用的结构信息并大大减少要处理的数据量的一种技术，目前已广泛应用于各种计算机视觉系统。Canny发现，在不同视觉系统上对边缘检测的要求较为类似，因此，可以实现一种具有广泛应用意义的边缘检测技术。边缘检测的一般标准包括： 以低的错误率检测边缘，也即意味着需要尽可能准确的捕获图像中尽可能多的边缘。 检测到的边缘应精确定位在真实边缘的中心。 图像中给定的边缘应只被标记一次，并且在可能的情况下，图像的噪声不应产生假的边缘。 为了满足这些要求，Canny使用了变分法。Canny检测器中的最优函数使用四个指数项的和来描述，它可以由高斯函数的一阶导数来近似。 在目前常用的边缘检测方法中，Canny边缘检测算法是具有严格定义的，可以提供良好可靠检测的方法之一。由于它具有满足边缘检测的三个标准和实现过程简单的优势，成为边缘检测最流行的算法之一。 Canny边缘检测算法的处理流程 Canny边缘检测算法可以分为以下5个步骤： 使用高斯滤波器，以平滑图像，滤除噪声。 计算图像中每个像素点的梯度强度和方向。 应用非极大值（Non-Maximum Suppression）抑制，以消除边缘检测带来的杂散响应。 应用双阈值（Double-Threshold）检测来确定真实的和潜在的边缘。 通过抑制孤立的弱边缘最终完成边缘检测。 下面详细介绍每一步的实现思路。 用高斯滤波器平滑图像 高斯滤波是一种线性平滑滤波，适用于消除高斯噪声，特别是对抑制或消除服从正态分布的噪声非常有效。滤波可以消除或降低图像中噪声的影响，使用高斯滤波器主要是基于在滤波降噪的同时也可以最大限度保留边缘信息的考虑。 高斯滤波实现步骤： 彩色RGB图像转换为灰度图像 边缘检测是基于对图像灰度差异运算实现的，所以如果输入的是RGB彩色图像，需要先进行灰度图的转换。 RGB转换成灰度图像的一个常用公式是： $$ Gray = R*0.299 + G*0.587 + B*0.114 $$ 注意一般情况下图像处理中彩色图像各分量的排列顺序是B、G、R。 RGB原图像： 转换后的灰度图： Java代码调用系统库实现： public static Mat RGB2Gray(Mat image) { // Gray = R*0.299 + G*0.587 + B*0.114 Mat gray = new Mat(); Imgproc.cvtColor(image, gray, Imgproc.COLOR_BGR2GRAY); return gray; } 一维，二维高斯函数及分布 一维高斯函数表述为： $$ G(x) = \frac {1}{\sqrt {2\pi}\sigma}\exp(-\frac {(x-\mu_x)^2}{2\sigma^2}) $$ 对应图形： 二维高斯函数表述为： $$ G(x) = \frac {1}{ {2\pi}\sigma^2}\exp(-\frac {(x-\mu_x)^2+(y-\mu_y)^2}{2\sigma^2}) $$ 对应图形： 一些重要特性说明： 一维二维高斯函数中$μ$是服从正态分布的随机变量的均值，称为期望或均值影响正态分布的位置，实际的图像处理应用中一般取$μ=0;~σ$是标准差，$σ^2$是随机变量的方差，$σ$定义了正态分布数据的离散程度，$σ$越大，数据分布越分散，σ越小，数据分布越集中。 在图形或滤波效果上表现为：$σ$越大，曲线越扁平，高斯滤波器的频带就越宽，平滑程度就越好，$σ$越小，曲线越瘦高，高斯滤波的频带就越窄，平滑程度也越弱； 二维高斯函数具有旋转对称性，即滤波器在各个方向上的平滑程度是相同的．一般来说，一幅图像的边缘方向是事先不知道的，因此，在滤波前是无法确定一个方向上比另一方向上需要更多的平滑．旋转对称性意味着高斯平滑滤波器在后续边缘检测中不会偏向任一方向； 高斯函数是单值函数。这表明，高斯滤波器用像素邻域的加权均值来代替该点的像素值，而每一邻域像素点权值是随该点与中心点的距离单调增减的。这一性质是很重要的，因为边缘是一种图像局部特征，如果平滑运算对离算子中心很远的像素点仍然有很大作用，则平滑运算会使图像失真； 相同条件下，高斯卷积核的尺寸越大，图像的平滑效果越好，表现为图像越模糊，同时图像细节丢失的越多；尺寸越小，平…