15.基本阈值操作

  1. 主要内容
    图像阈值
    阈值类型
    二值化分割——五种方式的算法了解
    寻找阈值 ——两种方式的算法了解
  2. 阈值(threshold)
    简单点说是把图像分割的标尺,我们也可以自己设定阈值的大小。
    OpenCV提供两种阈值产生算法
  3. 阈值的类型
    (1)类型一——阈值二值化(threshold binarg)
    左下方的图表示图像像素点Src(x,y)值的分布情况,蓝色水平线表示阈值
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

(2)类型二——阈值反二值化(threshold binary lnverted)
左下方的图表示图像像素点Src(x,y)值的分布情况,蓝色水平线表示阈值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3)类型三——截断(truncate)
左下方的图表示图像像素点Src(x,y)值的分布情况,蓝色水平线表示阈值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)类型四——阈值取零(threshold to zero)
左下方的图表示图像像素点Src(x,y)值的分布情况,蓝色水平线表示阈值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(5)类型五——阈值反取零(threshold to zero inverted)
左下方的图表示图像像素点Src(x,y)值的分布情况,蓝色水平线表示阈值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 类型表示汇总
    在这里插入图片描述
    前五种分别是不同类型的阈值方法
    最后两种是产生阈值的方法
    注意事项:
    使用 THRESH_OTSU 和 THRESH_TRIANGLE做阈值的时候,图像只能是8位单通道的图像(灰度图),否则程序报错

  2. 相关API
    (1)阈值操作

threshold(
InputArray src,//输入图像
InputArray dst,//输出图像
double thresh,//阈值
double maxval,//最大值
int type//类型
)

(2) 使用自动选取阈值

threshold(gray_src,dst,0,255,THRESH_OTSU|type_value);
threshold(gray_src,dst,0,255,THRESH_TRIANGLE|type_value);
//此时由于自动选取阈值,所以仅需要填写最大值即可,阈值自动计算,无法改变
//type_value:此处填写不同阈值方法的宏
  1. 最终代码
#include<opencv2\opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

void  on_Trackbar(int, void *);

int g_nAlphaValueSlider;
const int g_nMaxAlphaValue = 255;
int g_nNowchoose=0;
const int g_nMaxValue = 4;

Mat src, BIn_image,BInINV_image,TRu_image, ZERO_image,ZEROINV_image,gray_image;

int main(int argc, char **argv) {
	src = imread("G:\\photo\\test.jpg");
	namedWindow("图像二值化测试", CV_WINDOW_AUTOSIZE);
	cvtColor(src, gray_image, CV_BGR2GRAY);
	if (src.empty()) {
		cout << "We could not find this photo.." << endl;
	}
	imshow("原图像", gray_image);

	createTrackbar("当前图像阈值", "图像二值化测试",&g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);
	createTrackbar("当前阈值类型", "图像二值化测试", &g_nNowchoose, g_nMaxValue, on_Trackbar);
	on_Trackbar(g_nAlphaValueSlider,0);

	waitKey(0);
	return 0;
}
//THRESH_BINAR=0,THRESH_BINARY_INV=1,THRESH_TRUNC=2,THRESH_TOZERO=3,THRESH_TOZERO_INV=4;

void  on_Trackbar(int ,void *) {
	char type[20];
	threshold(gray_image, BIn_image, g_nAlphaValueSlider, g_nMaxAlphaValue, THRESH_TRIANGLE | g_nNowchoose);
	imshow("图像二值化测试", BIn_image);
	switch (g_nNowchoose)
	{
	case(0): 
		cout << "阈值二值化" << endl;
		break;
	case(1):
		cout << "阈值反二值化" << endl;
		break;
	case(2):
		cout << "截断" << endl;
		break;
	case(3):
		cout << "阈值取零" << endl;
		break;
	case(4):
		cout << "阈值反取零" << endl;
		break;
	}
}
/*

threshold(src, BIn_image, thresh,255,THRESH_BINARY);
imshow("阈值二值化", BIn_image);

threshold(src, BInINV_image, thresh, 255, THRESH_BINARY_INV);
imshow("阈值反二值化", BInINV_image);

threshold(src, TRu_image, thresh, 255, THRESH_TRUNC);
imshow("截断", TRu_image);

threshold(src, ZERO_image, thresh, 255, THRESH_TOZERO);
imshow("阈值取零", ZERO_image);

threshold(src, ZEROINV_image, thresh, 255, THRESH_TOZERO_INV);
imshow("阈值反取零", ZEROINV_image);

*/
发布了41 篇原创文章 · 获赞 14 · 访问量 2004

猜你喜欢

转载自blog.csdn.net/qq_43367829/article/details/103974944
今日推荐