opencv——基本阈值操作

图像阈值(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,都取原值,图像不变

基本阈值操作可以用于图片去水印

猜你喜欢

转载自blog.csdn.net/qq_28258885/article/details/112789014