水岭算法是一种基于图论的图像分割算法,它将图像看做一个拓扑图,利用水位不断上升的过程将图像中的区域分割出来。以下是使用 C++ 实现分水岭算法的步骤及讲解:
导入必要的头文件:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
这里导入了 OpenCV 和 C++ 的标准输入输出流。
读入图像并转为灰度图:
Mat src = imread("input.jpg");
Mat gray, binary;
cvtColor(src, gray, COLOR_BGR2GRAY);
读入了一个名为 "input.jpg" 的图像,并将其转换为灰度图,方便后续的处理。
对灰度图进行阈值分割,得到二值图像:
threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
使用 OpenCV 中的阈值分割函数 threshold,将灰度图转换为二值图像。采用的是自适应阈值的方式(THRESH_OTSU),并且对结果取反(THRESH_BINARY_INV),这样得到的是白色区域为目标物体的二值图像。
对二值图像进行形态学操作,去除噪声并使图像内部连通:
这里使用了 OpenCV 中的形态学操作函数 morphologyEx,采用了开运算的方式(MORPH_OPEN),即先腐蚀再膨胀。通过设置卷积核的大小和形状(MORPH_RECT 表示矩形卷积核),可以去除二值图像中的小噪声,使图像内部连通。
Mat