赞
踩
将图像分为两个部分:黑和白两个区域
/*@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, //输入图像,应该为单通道
cv::Mat &imDst, //分割后的图像,大小和类型和imSrc相同
double thresh, //表示阈值
double maxval, //最大灰度值,一般设为255
int type //阈值化类型,详细介绍如下所示
};
参数type的介绍:type是一个枚举类型的数据
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】
根据图像不同区域的亮度分布计算局部阈值,对于图像的不同区域能够自适应计算不同阈值
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:
/*@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; }
在实际使用时,大部分是先通过算子寻找边缘,然后和区域生长融合来分割图像
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。