第15课 基本阈值操作

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);

参数信息:

  1. InputArray类型的src,输入数组,填单通道 , 8或32位浮点类型的Mat即可。

  2. OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放输出结果,且和第一个参数中的Mat变量有一样的尺寸和类型。

  3. double类型的thresh,阈值的具体值。

  4. double类型的maxval,当第五个参数阈值类型type取 THRESH_BINARY 或THRESH_BINARY_INV阈值类型时的最大值.

  5. 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);
}

在这里插入图片描述

发布了31 篇原创文章 · 获赞 12 · 访问量 2774

猜你喜欢

转载自blog.csdn.net/weixin_42877426/article/details/104213168