/*
* 基本阈值操作
*图像阈值(threshold)
阈值是什么?简单点说是把图像分割的标尺(图像的一个像素值),这个标尺是根据什么产生的,阈值产生算法或者阈值类型(Binary segmentation)
阈值产生的算法比较复杂,opencv给出两种阈值的算法供我们使用,
如果不用这两种算法就可以自己指定一个阈值,它就会根据你的阈值进行分割,那么根据阈值进行分割它分割的时候就有不同的方法进行分割
*阈值类型 5种类型 左下方的图表示图像像素点Src(x, y)值分布情况,蓝色水平线表示阈值
-阈值二值化(threshold binary):THRESH_BINARY
对于输入的原图像任意一个像素若大于阈值我们取最大值
-阈值反二值化(threshold binary Inverted):THRESH_BINARY_INV
大于阈值的等于0,小于阈值的让它变成最大值
-截断(truncate)
超过阈值的就和阈值相等
-阈值取零(threshold to zero)
如果大于阈值就等于原来的,如果小于阈值就取零、
-阈值反取零(threshold to zero inverted)
大于阈值取零,小于的时候不变
*产生阈值的两个方法
输入一个阈值,根据它给的阈值来做,阈值怎么给它找到,opencv提供了这两个方法:这两个方法只适用于灰度图像即8位的,用彩色图像就出大问题了
OTSU:可以帮助我们在图像上寻找一个合适的阈值,这样就不用手动输入一个阈值了 THRESH_OTSU
TRIANGLE:三角阈值法它也是帮我们寻找阈值
五种阈值的处理方法,两种阈值的寻找方法
*/
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int threshold_value = 127;
int threshold_max = 255;
int type_value = 2;
int type_max = 4;
void Threshold_Demo(int, void*); //进行一个阈值操作这边把它定义到一个变量里面去
Mat src, res, src_gray;
int main()
{
src = imread("D:/A_Graduation/Learning/opencv/learningOpencv/1.png");
imshow("src", src);
//阈值寻找方法首先要转化为灰度图像
cvtColor(src, src_gray, CV_BGR2GRAY); //这之后就可以进行阈值操作了
namedWindow("output");
// 名字 窗口 最大值 回掉方法
createTrackbar("threshold_value", "output", &threshold_value, threshold_max, Threshold_Demo);
createTrackbar("type_value", "output", &type_value, type_max, Threshold_Demo);
Threshold_Demo(0, 0);
waitKey(0);
return 0;
}
void Threshold_Demo(int, void*)
{
//threshold(src_gray, res, threshold_value, threshold_max, type_value);
threshold(src_gray, res, 0, 255,THRESH_TRIANGLE | type_value); //自动帮我们算阈值,忽略我们输入的阈值
imshow("output", res);
}