目录
图像分割是利用图像特征灰度、颜色、纹理和形状等将图像中特定的具有独特性质的区域进行划分,进而实现感兴趣的目标的提取。根据分割成因可以分为连续分割和非连续分割。连续分割是指将具有同一灰度级或相同特征的像素划分为不同区域,常见的分割方法有区域生成、阈值分割及聚类分割等。非连续分割是利用像素值突变特性来呈现不同边界区域以实现图像分割,常见的分割方法有点线检测、边缘及能量等。
0x01 分水岭分割
(一)分水岭分割
分水岭分割是基于自然的启发算法来模拟水流通过地形起伏的现象从而研究总结出来的一种分割方法,其基本原理是将图像特征看作地理上的地貌特征,利用像素的**灰度值分布**特征,对每个符合特征的区域进行划分,形成边界以构成**分水岭**。分水岭分割的图像被认为是地形起伏,其中所述梯度大小被解释为**高度**相关信息。对于分水岭算法中的图像像素点,一般需要关注下面三种特征点:
(1)局部最值点:这类点反映的是图像中的局部最小值点或局部最大值点。
(2)交汇边缘点:这类的产生是由于灰度不均匀变化,对应于分水岭中不同地域形成的交接点。
(3)连接区域点:通过局部最小值的像素点向外慢慢扩展,集水区间内的像素点会承担连接作用,同时水域流向会通过连接区域点留到局部最小值的点。
分水岭算法是一种很好的分割相互接触的物体图像的方式,但在边缘分割时精度却存在一定问题,比如在实际应用过程中会出现由于噪点过多,或者其他信息的干扰,会导致局部极值点过多,那么图像分割就难以实现。对于图像某些小区域的背景与前景分割将意味着会有更少的交汇边缘点,这样容易造成过分隔现象,常用的解决方法是合并视觉上的小区域部分,将其视为独立部分进行分割操作。
(二)实现分水岭分割
在计算机视觉中我们常常关注的目标特征是**颜色**和**灰度**,其实也有很多其他的方法比如形状描述子、颜色特征、距离特征等。对于某种场景下的应用,具有独特的纹理对象可以使用一个很好的纹理描述符。针对颜色不同的区域中的单个对象相同的扩展,我们可以使用颜色特征来测量对象的不同部分的相似性。
- 实现使用图像距离变换来实现分水岭分割算法:
- 对源图像进行灰度化,使用OTSU进行二值化操作。
- 对二值化图像进行形态学开操作。
- 利用distanceTransform完成图像距离变换操作。
- 归一化距离变换的统计图像,并计算相应连通域分割块。
代码如下:
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include "opencv2/core/core.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
cv::Mat displaySegResult(cv::Mat& segments, int numOfSegments) //, cv::Mat& image
{
cv::Mat wshed(segments.size(), CV_8UC3); // 创建对于颜色分量
vector<Vec3b> colorTab;
for (int i = 0; i < numOfSegments; i++)
{
int b = theRNG().uniform(0, 255);
int g = theRNG().uniform(0, 255);
int r = theRNG().uniform(0, 255);
colorTab.push_back(Vec3b((uchar)b, (uchar)g, (uchar)r));
} //应用不同颜色对每个部分
for (int i = 0; i < segments.rows; i++)
{
for (int j = 0; j < segments.cols; j++)
{
int index = segments.at<int>(i, j);
if (index == -1)
wshed.at<Vec3b>(i, j) = Vec3b(255, 255, 255);
else if (index <= 0 || index > numOfSegments)

本文详细介绍了图像分割中的分水岭算法,包括其基本原理、实现步骤和常见问题。通过将图像灰度值视为地形特征,利用分水岭分割方法进行区域划分,解决目标提取问题。文章还展示了分水岭分割的流程,包括灰度化、阈值化、形态学操作、距离变换和连通域分析,并提供了相关代码示例。此外,针对过度分割问题,提出了基于直方图相似性的合并策略,以减少分割区域并提高分割质量。
最低0.47元/天 解锁文章
1111

被折叠的 条评论
为什么被折叠?



