OpenCV-图像处理(14、基本阈值操作)

版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/86219790

图像阈值(threshold)

  • 简单点说是把图像分割的标尺,这个标尺是根据什么产生的,阈值产生算法?阈值类型。(Binary segmentation)二进制分割
  • OpenCV提供函数 cv :: threshold 来执行阈值操作。
    在这里插入图片描述
    1. src_gray:我们的输入图片
    2. dst:目标(输出)图像
    3. threshold_value:进行阈值操作的阈值
    4. max_BINARY_value:二进制阈值操作使用的值(设置所选像素)
    5. threshold_type:5个阈值操作之一。
  • 在阈值类型前,怎么寻找阈值? 除了主动输入,还可以用 THRESH_OTSU 、 THRESH_TRIANGLE 两种opencv提供的算法产生阈值(只适用于颜色数据是8位的图像,否则报错)

1. 阈值类型一阈值二值化(threshold binary)

  • 左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值
    在这里插入图片描述
    在这里插入图片描述

2. 阈值类型一阈值反二值化(threshold binary Inverted)

  • 左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值
    在这里插入图片描述
    在这里插入图片描述

3. 阈值类型一截断 (truncate)

  • 左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值
    在这里插入图片描述
    在这里插入图片描述

4. 阈值类型一阈值取零 (threshold to zero)

  • 左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值
    在这里插入图片描述
    在这里插入图片描述

5. 阈值类型一阈值反取零 (threshold to zero inverted)

  • 左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值
    在这里插入图片描述
    在这里插入图片描述

总结

在这里插入图片描述

代码示例

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;

Mat src,gray_src,dst;
char input_win[]="Input Windows",output_win[]="Output Windows";
int threshold_type=3,threshold_value=0;
int const max_value=255,max_type=4;
void Threshold_Demo(int, void* );

int main(){
	//1. 加载图像和显示原图
	src=imread("E:/Experiment/OpenCV/Pictures/dog2.jpg");
	if(src.empty()){
		printf("could not load image...");
		return -1;
	}
	namedWindow(input_win,CV_WINDOW_AUTOSIZE);
	namedWindow(output_win,CV_WINDOW_AUTOSIZE);
	imshow(input_win,src);//显示图片

	//2、如果是BGR,我们将其转换为灰度。可以使用函数cv :: cvtColor:
	cvtColor(src,gray_src,CV_BGR2GRAY);

	//3、为用户创建2个轨道栏以输入用户输入:
	createTrackbar("阈值类型:",output_win, &threshold_type, max_type, Threshold_Demo);
	createTrackbar("阈值大小:",output_win, &threshold_value, max_value, Threshold_Demo);

	Threshold_Demo(0,0);



	//不主动设置阈值,通过 THRESH_OTSU 或 THRESH_TRIANGLE 产生阈值,这个时候 threshold_value 参数不会起作用
	Mat dst1,dst2;
	int threshold_max=255;
    //THRESH_OTSU 是迭代找到颜色数据最大最小值,然后找出一个阈值
    //THRESH_TRIANGLE 如果图像中的对象是一样的(颜色都是一个色调),用这个寻找阈值更好
    threshold(gray_src, dst1, threshold_value, threshold_max, THRESH_OTSU | threshold_type);//传参设置阈值类型
    imshow("THRESH_OTSU", dst1);
    threshold(gray_src, dst2, threshold_value, threshold_max, THRESH_TRIANGLE| threshold_type);//THRESH_TRIANGLE
    imshow("THRESH_TRIANGLE", dst2);

	waitKey(0);
	return 0;
}

void Threshold_Demo(int, void*){
	//1. src_gray:我们的输入图片
	//2. dst:目标(输出)图像
	//3. threshold_value:进行阈值操作的阈值
	//4. max_BINARY_value:二进制阈值操作使用的值(设置所选像素)
	//5. threshold_type:5个阈值操作之一。
	//参数:输入,输出,设置的阈值,maxVal,阈值类型
	threshold(gray_src, dst, threshold_value, 255, threshold_type);
	imshow(output_win, dst);
}

运行截图

在这里插入图片描述

参考博客

  1. https://blog.csdn.net/huanghuangjin/article/details/80962043
  2. https://blog.csdn.net/LYKymy/article/details/83154291

猜你喜欢

转载自blog.csdn.net/qq_42887760/article/details/86219790