大家好,欢迎来到IT知识分享网。
阈值是界限的意思,阈值分割就是以一个合适的像素值作为界限将图像处理成高对比度、容易识别的图像的一种方法。
threshold()
double cv::threshold(
cv::InputArray src, // 输入图像
cv::OutputArray dst, // 输出图像
double thresh, // 阈值
double maxValue, // 向上最大值
int thresholdType // 阈值化操作的类型
)
举个例子理解下thresholdType,拿第一种方法为例。像素值如果大于阈值,则把像素值变成255,否则,变成0.这样以来,就把原图变成黑白两色,对比度明显。
threshold(image, t_image,120, 255,CV_THRESH_BINARY);
自适应阈值分割
void cv::adaptiveThreshold(
cv::InputArray src, // 输入图像
cv::OutputArray dst, // 输出图像
double maxValue, // 向上最大值
int adaptiveMethod, // 自适应方法,平均或高斯
int thresholdType // 阈值化类型
int blockSize, // 块大小
double C // 常量
);
adaptiveThreshold()支持两种自适应方法,cv::ADAPTIVE_THRESH_MEAN_C(平均)和cv::ADAPTIVE_THRESH_GAUSSIAN_C(高斯)。
adaptiveThreshold(image, src, 255, ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,5,20);
自适应阈值不用自己选择,该函数根据图像情况自己设定。
该图是经canny检测之后的阈值分割图。
阈值分割还有一种方法,直接说明:
Mat image = imread("D:\\program\\bu1.png",0);//读入模板图
imshow("原图",image);
waitKey(0);
Mat dstImg(image.size(), CV_8UC3, Scalar::all(0));//纯黑图像
int u1 = image.rows;//阈值化处理
int u2 = image.cols;
for (int i = 0; i < image.rows; i++)
{
for (int j = 0; j < image.cols; j++)
{
sum = sum + image.at<uchar>(i, j);
}
}
int u = u1*u2;
int average = (int)sum/u*2;
threshold(image, t_image, average, 255,CV_THRESH_BINARY);
Canny(src,t_image,50,50);
imshow("阈值分割图",t_image);
waitKey(0);
该方法简单明了,阈值取值适中,不错。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24734.html