目录
- 图像阈值(threshold)
- 阈值有哪些
- 阈值二值化
- 阈值反二值化
- 截断
- 阈值取零
- 阈值反取零
- 总结
- API
- 代码展示
- 效果
- 总结
图像阈值(threshold)
阈的意思是界限,那阈值就是界限值。
比如
- 一堆苹果,直径大于7厘米算合格,小于7厘米不合格
- 考试成绩,分数大于60算及格,分数小于60不及格
通过上面这种分类,我们将所有的变量分成两个类别,分类的标准,也就是界限,就是阈值。
阈值有哪些
- (1)阈值二值化(threshold binary)。
- (2)阈值反二值化(threshold binary Inverted)
- (3)截断 (truncate)
- (4)阈值取零 (threshold to zero)
- (5)阈值反取零 (threshold to zero inverted)
阈值二值化
阈值二值化就是通过阈值将所有的情况分成两种情况
- 1.大于阈值,取最大值。
- 2.小于等于阈值取0。
对于左图,如果我们进行二值化操作,那么蓝色的线以上的,都变成最大值,蓝色的线以下的线都变成0,也就是右图
阈值反二值化
阈值反二值化也是通过阈值将所有的情况分成两种情况,但是和二值化相反:
- 1.大于阈值,取0。
- 2.小于等于阈值取最大值。
对于左图,如果我们进行反二值化操作,那么蓝色的线以下的,都变成最大值,蓝色的线以上的线都变成0,也就是如右图
截断
截断从字面意思去理解也是比较简单的,大家可以想一下园丁在修建花草,为了美观,会把所有的树剪成一样高的,也就是会把大于阈值的去掉:
- 1.大于阈值的,取阈值。
- 2.小于等于阈值取原值。
如果用公式表示一下,就是如下的公式
对于左图,如果我们进行截断操作,也就是如右图
阈值取零
阈值取零相当于设限,大家考虑比赛,如果比赛晋级,那成绩有效,继续比赛,如果成绩没有达标,那就算输,成绩归零,也就是会把小于阈值的归零
- 1.大于阈值的,取原值。
- 2.小于等于阈值取0。
对于左图,我们阈值取零后,得到右图
阈值反取零
阈值反取零和阈值取零相反,也就是会把大于阈值的取零:
- 1.大于阈值的,取0。
- 2.小于等于阈值取原值。
如果用公式表示一下,就是如下的公式
对于左图,阈值反取零,阈值以上置0,如右图
总结
如何找到阈值,opencv提供了两种方法
- THERSH_OTSU 和 THERSH_OTSU
API
double threshold(
InputArray src,
OutputArray dst,
double thresh,
double maxval,
int type
);
- (1)InputArray类型的src ,输入图像,多通道、8位或32位浮点。
- (2)OutputArray类型的dst ,输出图像,图像的大小、类型、通道数和输入图像相同。
- (3)double类型的thresh,阈值。
- (4)double类型的maxval,使用THRESH_BINARY 和THRESH_BINARY_INV阈值类型时候的最大值。
- (5)int类型的type,阈值类型,取值参见:cv::ThresholdTypes。
代码展示
结合滑动条进行代码编写
我们通过调整trackbar来控制阈值,并实现阈值类型的来回切换
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
//全局变量
Mat src, dst;
int thresholdValue = 127;
int thresholdMax = 255;
int typeValue = 2;
int typeMax = 4;
const char* output_title = "binary img";//窗口名称“二值化图像”
void Threshold_Demo(int, void*);//二值化演示函数
//主函数入口
int main()
{
src = imread("C:/Users/86176/Pictures/pics/lena(1).tiff");
if (!src.data)
{
cout << "could not load image..." << endl;
return -1;
}
imshow("show image", src);
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
createTrackbar("Threshold Value", output_title, &thresholdValue, thresholdMax, Threshold_Demo);//动态调整
createTrackbar("Type Value", output_title, &typeValue, typeMax, Threshold_Demo);
Threshold_Demo(0, 0);
imshow(output_title, dst);
waitKey(0);
return 0;
}
void Threshold_Demo(int, void*)
{
threshold(src, dst, thresholdValue, thresholdMax, typeValue);
imshow(output_title, dst);
}
效果
opencv基本阈值操作
总结
thresholdType = 0
阈值二值化
- 阈值设为0,所偶象素都大于0,都取最大值255,为白色
- 阈值设为255,所有像素都小于255,都取0,为黑色
thresholdType = 1
阈值反二值化
- 阈值设为0,所偶象素都大于0,都取最小值0,为黑色
- 阈值设为255,所有像素都小于255,都取最大值255,为白色
thresholdType = 2
截断
- 阈值设为0,所偶象素都大于0,都取阈值0,为黑色
- 阈值设为255,所有像素都小于等于255,都取自己原值,图像不变
thresholdType = 3
阈值取0
- 阈值设为0,所偶象素都大于0,都取原值,图像不变
- 阈值设为255,所有像素都小于等于255,都取0,图像为黑色
thresholdType = 4
阈值反取0
- 阈值设为0,所偶象素都大于0,都取0,图像为黑色
- 阈值设为255,所有像素都小于等于255,都取原值,图像不变
基本阈值操作可以用于图片去水印