目录
1. 图像阈值(Threshold)
阈值 是什么?简单点说是把图像分割的标尺。这个标尺是根据什么产生的,阈值产生算法|阈值类型。(Binary segmentation)
- 其中阈值产生算法有THRESH_OTCU和THRSE_TRIANGLE两种。
2. 阈值类型
2.1 阈值二值化(Threshold Binary)
- 将高于阈值的像素点置为最大值255,低于阈值的像素点置为0。
下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值 .
2.2 阈值反二值化(Threshold Binary Inverted)
- 将高于阈值的像素点置为0,低于阈值的像素点置为255。
下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值
2.3 截断(Truncate)
- 将高于阈值的像素点置为阈值值,低于阈值的像素点保持不变。
下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值
2.4 阈值取零(Threshold to Zero)
- 将高于阈值的像素点保持不变,低于阈值的像素点置为0。
下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值
2.5 阈值反取零(Threshold to zero inverted)
- 将高于阈值的像素点置为0,低于阈值的像素点保持不变。
下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值
2.6 汇总
- 前五个为阈值类型,最后两个是阈值产生算法。
3. 相关API
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);
参数信息:
-
InputArray类型的src,输入数组,填单通道 , 8或32位浮点类型的Mat即可。
-
OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放输出结果,且和第一个参数中的Mat变量有一样的尺寸和类型。
-
double类型的thresh,阈值的具体值。
-
double类型的maxval,当第五个参数阈值类型type取 THRESH_BINARY 或THRESH_BINARY_INV阈值类型时的最大值.
-
int类型的type,阈值类型,。
其它参数很好理解,我们来看看第五个参数,第五参数有以下7种类型。其中最后两个为自动计算阈值,将第三个参数thresh设为0即可。
0: THRESH_BINARY 当前点值大于阈值时,取Maxval,也就是第四个参数,下面再不说明,否则设置为0
1: THRESH_BINARY_INV 当前点值大于阈值时,设置为0,否则设置为Maxval
2: THRESH_TRUNC 当前点值大于阈值时,设置为阈值,否则不改变
3: THRESH_TOZERO 当前点值大于阈值时,不改变,否则设置为0
4: THRESH_TOZERO_INV 当前点值大于阈值时,设置为0,否则不改变
5: THRESH_OTCU | type
6: THRESH_TRIANGLE | type
4. 例程
#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 = "output image";
void Threshold_Demo(int, void*);
int main(int argc, char** argv) {
src = imread("D:/vcprojects/images/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("Thresh:", output_title, &threshold_value, threshold_max, Threshold_Demo);
createTrackbar("Type:", 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(src, dst, 0, 255, THRESH_TRIANGLE | type_value);
imshow(output_title, dst);
}