理论

阈值的类型:

阈值二值化

          

阈值曲线的性能数据分析方法 阈值图怎么画_#include

              

阈值曲线的性能数据分析方法 阈值图怎么画_阈值曲线的性能数据分析方法_02

                                  图1                                                                            图2

图像的像素值大小如图1所示,蓝色线代表阈值,红色部分代表像素值,大于阈值的像素值设置为最大值255,小于阈值的设置为0,从而得到新图像的像素值只有0和255两个值,完成二值化。具体的数学表达公式如下:

                                          

阈值曲线的性能数据分析方法 阈值图怎么画_方差_03

阈值反二值化

                

阈值曲线的性能数据分析方法 阈值图怎么画_阈值曲线的性能数据分析方法_04

               

阈值曲线的性能数据分析方法 阈值图怎么画_#include_05

                                           图1                                                                           图2 

图像的像素值大小如图1所示,蓝色线代表阈值,红色部分代表像素值,大于阈值的像素值设置为最小值0,小于阈值的设置为最大值255,从而得到新图像的像素值只有0和255两个值,完成二值化。具体的数学表达公式如下:

                                                

阈值曲线的性能数据分析方法 阈值图怎么画_阈值曲线的性能数据分析方法_06

截断

                 

阈值曲线的性能数据分析方法 阈值图怎么画_#include_07

                 

阈值曲线的性能数据分析方法 阈值图怎么画_阈值曲线的性能数据分析方法_08

  

                                              图1                                                                         图2

图像的像素值大小如图1所示,蓝色线代表阈值,红色部分代表像素值,大于阈值的像素值设置为阈值,小于阈值的像素值保持不变。具体的数学表达公式如下:

                                               

阈值曲线的性能数据分析方法 阈值图怎么画_方差_09

阈值取零

                     

阈值曲线的性能数据分析方法 阈值图怎么画_方差_10

               

阈值曲线的性能数据分析方法 阈值图怎么画_方差_11

                                               图1                                                                             图2

图像的像素值大小如图1所示,蓝色线代表阈值,红色部分代表像素值,大于阈值的像素值保持不变,小于阈值的像素值设置为0。具体的数学表达公式如下:

                                                     

阈值曲线的性能数据分析方法 阈值图怎么画_阈值曲线的性能数据分析方法_12

阈值反取零

                        

阈值曲线的性能数据分析方法 阈值图怎么画_二值化_13

              

阈值曲线的性能数据分析方法 阈值图怎么画_方差_14

                                                      图1                                                                       图2 

图像的像素值大小如图1所示,蓝色线代表阈值,红色部分代表像素值,大于阈值的像素值设置为0,小于阈值的像素值保持不变。具体的数学表达公式如下:

                                                           

阈值曲线的性能数据分析方法 阈值图怎么画_方差_15

最大类间方差法(OTSU)

它是根据图像的灰度特性,将图像分为前景和背景两个部分。当取最佳阈值时,两部分之间的差别应该是最大的,在OTSU算法中所采用的衡量差别的标准就是较为常见的最大类间方差。前景和背景之间的类间方差如果越大,就说明构成图像的两个部分之间的差别越大,当部分目标被错分为背景或部分背景被错分为目标,都会导致两部分差别变小,当所取阈值的分割使类间方差最大时就意味着错分概率最小。

自适应阈值法(TRIANGLE)

一种较为简单的自适应阈值选取方法是对每个像素确定以其自身为中心的一个领域窗口,寻找窗口内像素的最大值与最小值,并取二者的平均值作为阈值,或者将窗口内所有像素的平均值作为阈值,亦或者将窗口内的所有像素的高斯卷积作为阈值。

API

double cv::threshold( InputArray src, // 输入图像,OutputArray dst, // 输出图像,double thresh, // 阈值,double maxValue, // 向上最大值,int thresholdType // 阈值化操作的类型); 对thresholdType的定义-enum ThresholdTypes { THRESH_BINARY= 0, THRESH_BINARY_INV = 1,THRESH_TRUNC= 2, THRESH_TOZERO= 3,THRESH_TOZERO_INV = 4, THRESH_MASK= 7,THRESH_OTSU= 8,THRESH_TRIANGLE= 16};

thresholdType类型有如下几种:

    

阈值曲线的性能数据分析方法 阈值图怎么画_二值化_16

代码示例

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
Mat src, gray_src, dst;
int threshold_value = 127;
int threshold_max = 255;
int type_value = 2;
int type_max = 4;
const char* output_title = "binary image";
void Threshold_Demo(int, void*);
int main(int argc, char** argv) {
	src = imread("D:/test.png");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	namedWindow(output_title, CV_WINDOW_AUTOSIZE);
	imshow("input image", src);
	
	createTrackbar("Threshold Value:", output_title, &threshold_value, threshold_max, Threshold_Demo);//阈值
	createTrackbar("Type Value:", output_title, &type_value, type_max, Threshold_Demo);//阈值分割类型
	Threshold_Demo(0, 0);

	waitKey(0);
	return 0;
}

void Threshold_Demo(int, void*) {
	cvtColor(src, gray_src, CV_BGR2GRAY);
	threshold(gray_src, dst, threshold_value, 255, type_value);
	imshow(output_title, dst);
}

运行结果

阈值曲线的性能数据分析方法 阈值图怎么画_#include_17

拖动滚动滑条可以改变阈值和分割类型。