【计算机视觉系列实战教程 (十二)】:图像分割(阈值分割threshold、分水岭算法watershed的使用步骤、洪水填充floodFill算法的使用)

1.图像分割概述

(1)What(什么是图像分割)

将图像划分为不同的子区域,使得同一子区域具有较高的相似性,不同的子区域具有明显的差异性

(2)Why(对图像进行分割有什么作用)

  • 医学领域:将不同组织分割成不同区域帮助分析病情
  • 军事领域:通过对图像的分割,为自动目标识别提供参数,为飞行器或武器的精准导航提供依据
  • 遥感领域:通过遥感图像分析城市地貌、作物生长情况。此外,云系分析和天气预报都离不开图像分割
  • 交通领域:车辆跟踪和车牌识别
  • 工业领域:零部件分类、质量评估等

(3)Which(有哪些图像分割的方法)

  • 基于阈值的分割方法:利用灰度直方图得到分割的阈值,利用这些阈值将图像分为几个部分,核心思想是认为同一部分的像素是同一个物体。
  • 基于边缘的分割方法:检测图像的边界以实现对图像的分割
  • 基于区域的分割方法:核心思想是将有相似特性的像素集合起来构成区域,将差异性较大的区域进行分裂
  • 基于神经网络的分割方法:这里不多赘言,现在很火…
  • 基于聚类的分割方法:依据像素相似度,使用聚类算法将像素划分为不同类别

2.基于阈值的分割

(1)固定阈值分割

将图像分为两个部分:黑和白两个区域

/*@author @还下着雨ZG
* @brief 固定阈值图像分割
* @param[in] imSrc, 待分割的图像
* @param[out] imSegment, 分割后的图像
* @param[in] threVal, 输入的阈值
* @return, 返回正整数表示图像分割成功,负整数表示失败
**/
int ImgSegmentByGlbThreVal(const cv::Mat& imSrc, cv::Mat& imSegment, int threVal)
{
   
	if(imSrc.empty()) return -1;
	if(threVal<0 || threVal>255) return -2;
	// 图像预处理
	cv::Mat imGray;
	if(imSrc.channels()==1) imGray = imSrc.clone();
	else if(imSrc.channels() == 3)
	{
   
		cv::cvtColor(imSrc, imGray, cv::COLOR_RGB2GRAY);
	}
	else
	{
   
		return -3;
	}
	cv::GaussianBlur(imGray, imGray, cv::Size(3,3), 0);
	//全局阈值法
	cv::threshold(imGray, imSegment, threVal);
	return 1;
}

阈值分割函数threshold的介绍:

double cv::threshold(
	cv::Mat &imSrc, //输入图像,应该为单通道

你可能感兴趣的:(计算机视觉,计算机视觉,人工智能)