《深度学习图像分割》第2章:传统图像分割算法

科技   2024-11-05 16:16   浙江  

《深度学习图像分割》这本书写写停停,历经三年多,目前在二稿修订中。正式出版之前,计划先在GitHub做逐步的内容和代码开源。

以下为本书第2章节选内容:

图像分割是数字图像处理和计算机视觉领域中的一个经典问题,旨在将图像划分为若干具有特定意义的子区域或目标对象。图像分割是一种典型的图像处理方法,其输入和输出都是图像。传统的图像分割方法通常基于图像的两个基本属性:灰度值的不连续性和灰度值的相似性,并围绕这两个特性设计不同的算法。传统图像分割算法主要包括基于边缘检测的图像分割、基于阈值的图像分割、基于区域生长的图像分割、基于形态学的图像分割和基于图论的图像分割等。本章将详细阐述以上五大类传统图像分割算法,并通过OpenCV展示这些算法的具体应用示例和效果。结合实例分析将有助于更好地理解各类分割算法的适用场景和性能表现。

2.1 概述

传统图像分割算法是区别于近年来兴起的深度学习图像分割算法的一大类方法,在深度学习出现之前,传统算法通过数字图像处理技术发展出了众多经典的分割方法。本节将对传统图像分割算法进行概述,并在后续小节(2.2~2.6节)中对各类分割算法进行详细阐述。

图像分割是计算机视觉中的一个经典问题,也是研究热点之一。它的目标是基于图像的灰度、色彩、纹理、边缘及几何形态等特征,通过相关数学方法将图像划分为若干个互不相交的区域。这些区域内部具有较强的一致性或相似性,而不同区域之间则表现出显著的差异性,从而实现图像的结构化处理和理解。由于不同图像的复杂度和特征差异,传统图像分割算法的发展过程中尚未形成一个通用的解决方案。然而,关于图像分割的一些基本规律和原则已经达成了共识,并催生了大量有效的分割算法。根据其核心思想和技术手段,这些算法大致可以分为以下五大类:

(1) 基于边缘检测的图像分割算法。这种方法通过检测图像中灰度或颜色变化最剧烈的区域,即边缘,来识别对象的边界。经典的边缘检测方法包括Canny算子、Sobel算子等,它们通过计算梯度或差分来识别边缘。

(2) 基于阈值的图像分割算法。阈值分割算法通过设定灰度或颜色的阈值,将图像中的像素划分为前景和背景。Otsu算法是其中的代表性方法,它能够自动确定图像的最佳全局阈值。

(3) 基于区域生长的图像分割算法。这一类方法根据区域内像素的相似性,从指定的种子点开始扩展区域。相似的像素被不断纳入同一分割区域,直至不再满足设定的相似性标准。

(4) 基于形态学的图像分割算法。形态学分割算法基于图像中的形状结构信息,通过数学形态学操作(如膨胀、腐蚀、开运算、闭运算等)实现图像区域的分割。分水岭算法是形态学方法中的重要一员,它通过将图像视为地形,模拟“水流”来确定区域边界。

(5) 基于图论的图像分割算法。这种方法将图像表示为图结构,像素或区域作为节点,节点之间的连接根据像素的相似性设定权重。然后通过切割图的方式来实现图像的分割。典型的算法包括Graph Cuts和GrabCut。

本章我们将分别对上述五大类图像分割算法进行阐述。

2.2 基于边缘检测的图像分割算法

基于边缘检测的图像分割算法是数字图像处理中的一种重要方法。它的基本思路是通过检测图像中的边缘信息,将图像中的像素分为属于不同区域的部分。边缘通常代表着图像中不同区域之间的边界或目标的轮廓,因此该方法能够较好地提取出图像中不同对象的边界信息。常用的边缘检测算子包括一阶梯度算子如Roberts、Prewitt、Sobel等,以及二阶梯度算子如Laplace和Kirsh等。这些算子通过计算图像的梯度来检测边缘。除此之外,Marr-Hildreth算子和Canny算子都是常见的高级边缘检测算子,具有低错误率、好的定位和单一响应等优点,是目前流行的边缘检测算子。

Canny算子是由John F. Canny于1986年提出的边缘检测算法,是一种基于多阶段处理的边缘检测方法,以其良好的边缘检测性能受到欢迎。Canny算子不仅考虑了噪声抑制,还在检测精度和定位精度上进行了权衡,是一种经典的边缘检测方法。Canny算子的具体步骤如下:

(1) Canny算子第一步与Marr-Hildreth算子类似,都是基于高斯滤波对图像进行平滑处理,参考式(2-12)。

(2) 计算梯度。这一步也跟Marr-Hildreth算子类似,但Canny算子是通过Sobel算子计算水平和垂直方向的梯度来检测边缘,并计算梯度幅度和方向,如式(2-14)~(2-17)所示。其中G为梯度幅度,θ为梯度方向。

(3) 非极大值抑制。非极大值抑制是Canny算子的关键步骤之一,旨在细化边缘,使其仅保留“最强”的边缘点,消除那些梯度较弱的点。其原理是,在梯度方向上检查当前像素是否为局部最大值,如果不是,则抑制该像素。

(4) 双阈值处理。非极大值抑制后,仍然会存在一些噪声和弱边缘。Canny算子使用双阈值方法来区分强边缘和弱边缘。分别设定高阈值T_h和低阈值T_l,梯度值大于高阈值的像素被认为是强边缘,直接保留;梯度值介于高阈值和低阈值之间的像素被认为是弱边缘。如果这些弱边缘与强边缘相连,则保留为边缘;否则作为噪声去除。这种双阈值处理可以有效过滤掉噪声引起的虚假边缘,同时保留真正的边缘。

(5) 连接分析。连接分析是指在双阈值处理之后,将弱边缘与强边缘相连。如果某个弱边缘像素与强边缘相邻,则认为它也是有效边缘,并将其保留。这一步确保了边缘的连续性,防止边缘线断裂。

综合比较其他边缘检测算子来看,Canny算子是一个综合性能很强的边缘检测方法,具有高精度和鲁棒性。通过高斯平滑、梯度计算、非极大值抑制、双阈值处理和连接分析等多个步骤,Canny算子能够在抑制噪声的同时,准确检测图像中的边缘,且边缘连贯性好。尽管其计算复杂度相对较高,但它依然是边缘检测任务中最常用的方法之一,尤其适合需要高精度边缘检测的应用场景。接下来,我们重点看一下Marr-Hildreth算子和Canny算子的实际边缘检测分割效果。

本节给出一张示例图像,分别通过Marr-Hildreth算子和Canny算子来对其进行边缘检测分割,代码2-1展示了Canny算子进行边缘检测的实现过程,限于篇幅,Marr-Hildreth算子的代码实现过程可参考本书GitHub代码地址。

代码2-1 基于Canny算子的边缘检测算法

#include <opencv2/opencv.hpp>#include <iostream>
int main() { // 读取图像:将图像读取为灰度图 Mat img = imread("./example.png", IMREAD_GRAYSCALE);
if (img.empty()) { cout << "Failed to read image." << endl; return -1; }
// 第一步: 高斯平滑 Mat blurred;// 高斯模糊,去除噪声 GaussianBlur(img, blurred, Size(5, 5), 1.0);
// 第二步: 使用Canny算子进行边缘检测 Mat edges; double lower_threshold = 50; // 设置Canny算子的低阈值 double upper_threshold = 150; // 设置Canny算子的高阈值 Canny(blurred, edges, lower_threshold, upper_threshold);
// Step 3: 保存分割结果 imwrite("./canny_edges.png", edges);
// 显示结果 namedWindow("Canny Edges", WINDOW_NORMAL); imshow("Canny Edges", edges); waitKey(0);
return 0;}

基于Marr-Hildreth算子和Canny算子的边缘检测分割效果如图2-2所示,可以看到,Canny边缘检测分割对于图像中房屋细小的边框轮廓的处理更加精细,整体分割效果要优于Marr-Hildreth算子。

2.3 基于阈值的图像分割算法
...

《深度学习图像分割》项目配套GitHub地址:

https://github.com/luwill/Deep-Learning-Image-Segmentation

欢迎各位读者阅读以及对本书提出意见与建议!

机器学习实验室
专注于机器学习和深度学习技术与实践。
 最新文章