opencv:基于阈值的分割方法(固定阈值和自适应阈值)

1、基于阈值的分割

(1)固定阈值分割

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

cpp 复制代码
/*@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的介绍:

cpp 复制代码
double cv::threshold(
	cv::Mat &imSrc, //输入图像,应该为单通道
	cv::Mat &imDst, //分割后的图像,大小和类型和imSrc相同
	double thresh, //表示阈值
	double maxval, //最大灰度值,一般设为255
	int type //阈值化类型,详细介绍如下所示
	};

参数type的介绍:type是一个枚举类型的数据

php 复制代码
THRESH_BINARY = 0, // ( x > thresh ) ? 255 : 0
THRESH_BINARY_INV = 1, // ( x > thresh ) ? 0 : 255
THRESH_TRUNC = 2, // ( x > thresh ) ? thresh : x
THRESH_TOZERO = 3, // ( x < thresh ) ? 0 : x
THRESH_TOZERO = 4, // ( x < thresh ) ? x : 0
THRESH_MASK = 7,
THRESH_OTSU = 8, // 自动处理,图像自适应二值化,常用区间【0-255】

(2)自适应阈值分割

根据图像不同区域的亮度分布计算局部阈值,对于图像的不同区域能够自适应计算不同阈值

cpp 复制代码
void cv::adaptiveThreshold(
	cv::Mat &imSrc, //输入的源图像
	cv::Mat &imDst, //输出图像
	double maxval, //预设满足条件的最大值
	int adaptMethod, //指定自适应阈值算法类型(ADAPTIVE_MEAN_C或ADAPTIVE_THRESH_GAUSSIAN_C两种)
	int threshType, //阈值类型(THRESH_BINARY或THRESH_BINARY_INV)
	int blockSize,  //领域块的大小,用于计算区域阈值(3,5,7 ...)
	double C, //与算法有关的参数,是一个从均值或加权均值提取的常数,可为负
	);

使用adaptiveThresh:

cpp 复制代码
/*@author @还下着雨ZG
* @brief 自适应阈值图像分割
* @param[in] imSrc, 待分割的图像
* @param[out] imSegment, 分割后的图像
* @return, 返回正整数表示图像分割成功,负整数表示失败
**/
int ImgSegmentByAdpThre(const cv::Mat& imSrc, cv::Mat& imSegment)
{
    if (imSrc.empty()) return -1;
    cv::Mat imGray;
    if (imSrc.channels() == 1)
    {
        cv::copyTo(imSrc, imGray, cv::Mat());
    }
    else if (imSrc.channels() == 3)
    {
        cv::cvtColor(imSrc, imGray, cv::COLOR_RGB2GRAY);
    }
    else
    {
        return -2;
    }
    cv::GaussianBlur(imGray, imGray, cv::Size(3, 3), 0);
    int blockSize = 3;
    int constValue = 0;
    cv::adaptiveThreshold(imGray, imSegment, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, blockSize,
        constValue);
    return 1;
}

在实际使用时,大部分是先通过算子寻找边缘,然后和区域生长融合来分割图像

相关推荐
可均可可几秒前
C++之OpenCV入门到提高004:Mat 对象的使用
c++·opencv·mat·imread·imwrite
埃菲尔铁塔_CV算法25 分钟前
人工智能图像算法:开启视觉新时代的钥匙
人工智能·算法
EasyCVR25 分钟前
EHOME视频平台EasyCVR视频融合平台使用OBS进行RTMP推流,WebRTC播放出现抖动、卡顿如何解决?
人工智能·算法·ffmpeg·音视频·webrtc·监控视频接入
打羽毛球吗️32 分钟前
机器学习中的两种主要思路:数据驱动与模型驱动
人工智能·机器学习
蒙娜丽宁33 分钟前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
好喜欢吃红柚子1 小时前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
小馒头学python1 小时前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
神奇夜光杯1 小时前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
正义的彬彬侠1 小时前
《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析
人工智能·决策树·机器学习·集成学习·boosting·xgboost
plmm烟酒僧1 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv