灰度梯度的表示形式、非极大值抑制、Canny算子、otsu

灰度梯度的表示形式主要有两种:梯度的幅度(magnitude)和梯度的方向(direction)。

1. **梯度的幅度(Gradient Magnitude)**:
   梯度的幅度表示在某个方向上像素灰度变化的强度。它通常通过计算图像灰度值的差分来获得,可以是一阶导数或二阶导数。梯度幅度的计算公式如下: 

梯度的幅度和方向可以一起用来描述图像中每个像素点的梯度信息。在图像处理中,这些信息常用于边缘检测、图像分割、特征提取等任务。例如,在Canny边缘检测算法中,就会使用梯度的幅度和方向来确定边缘的位置和强度。

在编程实现中,可以通过以下步骤来计算图像的梯度幅度和方向:

1. 使用Sobel、Prewitt等算子计算图像的梯度分量(水平和垂直方向)。
2. 根据梯度分量计算梯度幅度和方向。
3. 根据需要,可以对梯度幅度进行归一化处理,以增强图像的对比度。

这些步骤可以使用图像处理库如OpenCV来实现。例如,OpenCV提供了`Sobel`函数来计算图像的梯度,`phase`函数来计算梯度的方向。

非极大值抑制(Non-Maximum Suppression, NMS)是一种在计算机视觉中常用的技术,尤其是在特征点检测和目标检测领域。它的作用是去除多余的边缘或特征点,只保留最显著的特征。

在边缘检测或特征点检测过程中,通常会得到许多潜在的边缘或特征点。然而,并非所有这些点都是有意义的,有些可能是噪声引起的,有些可能是次要的边缘。非极大值抑制的目的是去除这些非显著的特征,只保留最强的特征

非极大值抑制的步骤:

  1. 梯度计算:首先,使用边缘检测算子(如Sobel、Canny等)计算图像的梯度幅度和方向。

  2. 阈值处理:设定一个阈值,只有梯度幅度超过这个阈值的点才会被考虑。

  3. 非极大值抑制

    • 对于每个像素点,检查其在梯度方向上的局部邻域。
    • 如果该点不是其局部邻域内梯度幅度最大的点,则将其抑制(即设置为0或忽略)。
    • 通常,局部邻域可以是3x3、5x5或更大的窗口。
  4. 结果:经过非极大值抑制后,剩下的点就是局部区域内梯度幅度最大的点,这些点被认为是最显著的边缘或特征点。

在非极大值抑制之后,根据像素点的梯度幅度将它们分为不同的类别,那么可以有以下分类方式:

  1. 强边缘像素(L1):梯度幅度高于某个高阈值的像素点,它们是图像中边缘最明显的地方。

  2. 弱边缘像素(L2):梯度幅度低于高阈值但高于低阈值的像素点,它们可能是边缘的一部分,但不如强边缘像素那么显著。

  3. 非边缘像素(L3):梯度幅度低于低阈值的像素点,它们在边缘检测中被忽略。

非极大值抑制后图像的特点:

  • 边缘更清晰:抑制后的图像中,边缘更加清晰,因为去除了次要的边缘和噪声。
  • 特征点更突出:在特征点检测中,非极大值抑制有助于突出最显著的特征点。

Canny算子是一种经典的边缘检测算法,由John F. Canny在1986年提出。它基于三个基本目标:低错误率(所有边缘都应被找到,且没有伪响应)、边缘点应被很好地定位(已定位的边缘必须尽可能接近真实边缘)、单一的边缘点响应(在仅存一个单一边缘点的位置,检测器不应指出多个像素边缘)。Canny算子的步骤包括:

1. **高斯平滑**:首先对输入图像进行高斯平滑,以降低噪声的影响。
2. **计算梯度幅度和方向**:使用Sobel算子计算图像的梯度幅度和方向,以估计每一点处的边缘强度与方向。
3. **非极大值抑制**:根据梯度方向,对梯度幅值进行非极大值抑制,这本质上是对Sobel、Prewitt等算子结果的进一步细化,目的是让边缘“变瘦”,只保留局部梯度最大的点。
4. **双阈值处理**:使用双阈值方法来确定最终的边缘信息。设置两个阈值,高阈值和低阈值,根据边缘像素的梯度值与这两个阈值的关系,判断边缘的属性。强边缘直接保留,弱边缘需要与强边缘连接才被保留。
5. **边缘连接**:通过滞后方法跟踪边缘,抑制所有其他弱边缘和未连接到强边缘的边缘,完成边缘检测。

Canny算子在图像处理中的应用非常广泛,包括但不限于特征点检测、目标识别、图像分割等领域。它的优势在于能够有效地检测图像中的边缘,并且对于一些实时应用,它的速度也比较快。在OpenCV库中,Canny算子的实现非常简单,只需要调用`cv2.Canny()`函数即可。此外,Canny算子还可以与其他图像处理技术结合,如拓扑滤波,以提高边缘检测的准确性和鲁棒性。
 

Canny边缘检测算法中的双阈值处理是一种关键步骤,用于确定哪些边缘是强边缘,哪些是弱边缘,以及哪些是噪声。以下是双阈值处理的实现步骤:

1. **选择阈值**:选择两个阈值,通常用高阈值(`T_HIGH`)和低阈值(`T_LOW`)。高阈值用于确定强边缘,而低阈值用于确定边缘的潜在候选。

2. **标记强边缘**:遍历图像中的每个像素点,如果其梯度幅度高于高阈值,则将其标记为强边缘。

3. **标记弱边缘**:如果某个像素点的梯度幅度低于高阈值但高于低阈值,它将被暂时保留,但不会立即标记为边缘。这些像素点被认为是弱边缘。

4. **边缘连接**:对于标记为弱边缘的像素点,检查其8个邻域像素(通常是水平、垂直和对角线方向的相邻像素)。如果这些邻域像素中有任何像素被标记为强边缘,则将当前的弱边缘像素也标记为强边缘。这一步确保了强边缘和弱边缘之间的连续性。

5. **抑制非边缘**:对于梯度幅度低于低阈值的像素点,它们被认为是非边缘像素,因此在最终的边缘图中将它们设置为0。

6. **结果合并**:合并步骤2和步骤4的结果,得到最终的边缘图。在这张图中,强边缘和通过连接步骤被确认为强边缘的弱边缘将被保留,而其他像素将被设置为0。

双阈值处理的关键在于选择合适的阈值。这两个阈值通常是基于图像的统计特性来确定的,例如,可以基于梯度幅度的直方图来选择这两个阈值。一个常见的选择方法是,高阈值是低阈值的2到3倍。

双阈值处理的目的是减少误检(将非边缘检测为边缘)和漏检(将真实边缘遗漏)的情况,同时保持边缘的连续性。这种方法在实际应用中非常有效,因为它能够在保持边缘完整性的同时,去除噪声和不相关的边缘信息。

上一篇:100种算法【Python版】第——优化算法之模拟退火算法


下一篇:协程1 --- 发展历史