opencvc++二值图像、阈值计算方法、全局阈值、自适应阈值-创新互联

1、图像定义:

彩色图像 :三通道,像素值一般为0~255;

创新互联公司是专业的石狮网站建设公司,石狮接单;提供成都网站制作、成都网站设计,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行石狮网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

灰度图像:单通道,像素值一般为0~255;

二值图像:单通道,像素值一般为0(黑色)、255(白色);

彩色图像颜色范围查询表:

2、图像阈值分割方法

设原图的像素值分布为如下红色区域,蓝色的线表示像素值阈值T。

2.1、二值分割

a)大于阈值T的像素点置满保留,其余置0。b)小于阈值T的像素点置满保留,其余去除。

2.2、其余阈值图像分割方法

a)大于阈值T的像素点值置为阈值。          b)小于阈值T的像素点值置0。

c)大于阈值T的像素点值置0。

API

threshold(灰度图, 输出图像, 阈值, 图像大像素值, 阈值分割方法);

阈值分割方法:

2.3、代码:
void QuickDemo::zero_one_img(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	namedWindow("gray", WINDOW_FREERATIO);
	imshow("gray", gray);
	Mat binary;
	threshold(gray, binary, 127, 255, THRESH_BINARY);
	namedWindow("THRESH_BINARY", WINDOW_FREERATIO);
	imshow("THRESH_BINARY", binary);
	threshold(gray, binary, 127, 255, THRESH_BINARY_INV);
	namedWindow("THRESH_BINARY_INV", WINDOW_FREERATIO);
	imshow("THRESH_BINARY_INV", binary);
	threshold(gray, binary, 127, 255, THRESH_TRUNC);
	namedWindow("THRESH_TRUNC", WINDOW_FREERATIO);
	imshow("THRESH_TRUNC", binary);
	threshold(gray, binary, 127, 255, THRESH_TOZERO);
	namedWindow("THRESH_TOZERO", WINDOW_FREERATIO);
	imshow("THRESH_TOZERO", binary);
	threshold(gray, binary, 127, 255, THRESH_TOZERO_INV);
	namedWindow("THRESH_TOZERO_INV", WINDOW_FREERATIO);
	imshow("THRESH_TOZERO_INV", binary);
}

3、阈值计算方法

  在图像阈值分割时,需要选取一个合适的阈值,基本分为全局阈值、自适应阈值两大类。

3.1 全局阈值法

  均值法:统计图像像素值的均值作为阈值。

void zero_one_img(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	Scalar m = mean(gray);
	//printf("means : %2f\n", m[0]);

	Mat binary;
	threshold(gray, binary, m[0], 255, THRESH_BINARY);
	namedWindow("THRESH_BINARY", WINDOW_FREERATIO);
	imshow("THRESH_BINARY", binary);
}

  OTSU法(基于最小类内方差求阈值的方法):基于像素直方图的统计结果,统计各像素点值的方差值,选类内方差最小的像素点值作为阈值。

如下对像素点值为2的像素点求类内方差的过程:

 a)分别 计算该像素点值左边、右边的比重,均值,方差。

b)计算类内方差:

void QuickDemo::zero_one_img(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	namedWindow("gray", WINDOW_FREERATIO);
	imshow("gray", gray);
	
	Mat binary;
	threshold(gray, binary, 0, 255, THRESH_BINARY|THRESH_OTSU);
	namedWindow("THRESH_OTSU", WINDOW_FREERATIO);
	imshow("THRESH_OTSU", binary);
}

Triangle法:获取如下直方图后,从最高点到最低点作一线段,以α和β为45°为前提,寻找右图上使得d大的线段,将此时α角点的像素点值作为阈值。

  注:在常规操作时,为了使得像素点值不过于靠近最多的像素点值,常常将其向右偏移20%的总像素距离。

void QuickDemo::zero_one_img(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	namedWindow("gray", WINDOW_FREERATIO);
	imshow("gray", gray);
	
	Mat binary;
	threshold(gray, binary, 0, 255, THRESH_BINARY|THRESH_TRIANGLE);
	namedWindow("THRESH_OTSU", WINDOW_FREERATIO);
	imshow("THRESH_OTSU", binary);
}

适用情况总结:OTSU法适用于有多峰直方图的图像,三角法使用有单峰直方图的图像。

3.2、自适应阈值

  采用卷积的方式,对图像逐个窗口的中心像素点值进行阈值处理,此时的每个窗口的阈值方法有窗口均值阈值法、高斯分布阈值法。

  API:

CV_EXPORTS_W void adaptiveThreshold( InputArray src, OutputArray dst,
                                     double maxValue, int adaptiveMethod,
                                     int thresholdType, int blockSize, double C );

maxValue ——赋予给满足条件的像素的非零值。
AdaptiveMethod ——要使用的自适应阈值算法, 如下:


thresholdType ——阈值分割方法,这里只能使用THRESH_BINARY等方法,不能使用OTSU法。
blockSize——用于计算像素阈值的像素邻域的大小:3、5、7 等。
C ——计算后均值被减去的值,如 threshvalure - C,C常为正数。

代码:

void QuickDemo::zero_one_img(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	namedWindow("gray", WINDOW_FREERATIO);
	imshow("gray", gray);
	
	Mat binary;
	adaptiveThreshold(gray, binary, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY,3,0);
	namedWindow("adaptiveThreshold", WINDOW_FREERATIO);
	imshow("adaptiveThreshold", binary);
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章名称:opencvc++二值图像、阈值计算方法、全局阈值、自适应阈值-创新互联
标题来源:http://azwzsj.com/article/hheos.html