理论
阈值的类型:
阈值二值化
图1 图2
图像的像素值大小如图1所示,蓝色线代表阈值,红色部分代表像素值,大于阈值的像素值设置为最大值255,小于阈值的设置为0,从而得到新图像的像素值只有0和255两个值,完成二值化。具体的数学表达公式如下:
阈值反二值化
图1 图2
图像的像素值大小如图1所示,蓝色线代表阈值,红色部分代表像素值,大于阈值的像素值设置为最小值0,小于阈值的设置为最大值255,从而得到新图像的像素值只有0和255两个值,完成二值化。具体的数学表达公式如下:
截断
图1 图2
图像的像素值大小如图1所示,蓝色线代表阈值,红色部分代表像素值,大于阈值的像素值设置为阈值,小于阈值的像素值保持不变。具体的数学表达公式如下:
阈值取零
图1 图2
图像的像素值大小如图1所示,蓝色线代表阈值,红色部分代表像素值,大于阈值的像素值保持不变,小于阈值的像素值设置为0。具体的数学表达公式如下:
阈值反取零
图1 图2
图像的像素值大小如图1所示,蓝色线代表阈值,红色部分代表像素值,大于阈值的像素值设置为0,小于阈值的像素值保持不变。具体的数学表达公式如下:
最大类间方差法(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类型有如下几种:
代码示例
#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);
}
运行结果
拖动滚动滑条可以改变阈值和分割类型。