前言
在上一章中描述了如何进行图像上采样和降采样,详细描述可点击查看(https://www.jianshu.com/writer#/notebooks/47386368/notes/78352031)
目标
本章中,将学习:
- 图像阈值
- 阈值类型
- 代码演示
图像阈值(Threshold)
- 阈值是什么?简单点说是把图像分割的标尺,这个标尺是根据什么产生的,阈值产生算法?阈值类型。(Binary segmentation)
阈值类型
-
阈值类型--阈值二值化(threshold binary)
左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值。
阈值二值化.png -
阈值类型--阈值反二值化(threshold binary interved)
左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值。
阈值反二值化.png -
阈值类型--截断(truncate)
左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值。
截断 .png -
阈值类型--阈值取零(threshold to zero)
左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值。
阈值取零.png -
阈值类型--阈值反取零(threshold to zero inverted)
左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值。
阈值反取零.png
threshold()函数原型如下:
double cv::threshold ( InputArray src,
OutputArray dst,
double thresh,
double maxval,
int type
)
参数解释:
. InputArray src: 输入图像,可以是Mat类型,图像必须为单通道8位或32位浮点型图像
. OutputArray dst: 输出图像,与输入图像尺寸和类型相同
. double thresh: 设定的阈值
. double maxval: 使用THRESH_BINARY和THRESH_BINARY_INV类型的最大值
. int type: 阈值化类型,可以通过ThresholdTypes查看,下面给出opencv中五种阈值化类型及其对应公式:
阈值化类型.png
代码演示
/*
*程序通过创建trackbar来控制阈值化类型
*通过调节trackbar来调节
*其具体阈值化类型如下:
*0: THRESH_BINARY 二进制阈值化
*1: THRESH_BINARY_INV 反二进制阈值化
*2: THRESH_TRUNC 截断阈值化
*3: THRESH_TOZERO 阈值化为0
*4: THRESH_TOZERO_INV 反阈值化为0
*/
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
//定义全局变量
Mat g_srcImage, g_srcGrayImage, g_dstImage;
const int typeMaxValue = 4;
int typeValue = 0;
const int binaryMaxValue = 255;
const int thresholdMaxValue = 255; //阈值的最大值
int thresholdValue = 0; //阈值的初始值
//定义回调函数
void thresholdFun(int, void*);
int main()
{
g_srcImage = imread("lena.jpg");
//判断图像是否加载成功
if(g_srcImage.empty())
{
cout << "图像记载失败!" << endl;
return -1;
}
else
cout << "图像加载成功!" << endl << endl;
cvtColor(g_srcImage, g_srcGrayImage, COLOR_RGB2GRAY); //将图像转化为灰度图
//创建轨迹条及其依附窗口
namedWindow("图像阈值化处理", WINDOW_AUTOSIZE);
char threasholdTypeName[20];
sprintf(threasholdTypeName, "阈值化类型 %d", typeMaxValue);
createTrackbar(threasholdTypeName, "图像阈值化处理", &typeValue, typeMaxValue, thresholdFun);
thresholdFun(typeValue, 0);
char thresholdValueName[20];
sprintf(thresholdValueName, "阈 值 %", thresholdMaxValue);
createTrackbar(thresholdValueName, "图像阈值化处理", &thresholdValue, thresholdMaxValue, thresholdFun);
thresholdFun(thresholdValue, 0);
waitKey(0);
return 0;
}
//回调函数
void thresholdFun(int, void*)
{
int thresholdType;
switch(typeValue)
{
case 0:
thresholdType = THRESH_BINARY;
break;
case 1:
thresholdType = THRESH_BINARY_INV;
break;
case 2:
thresholdType = THRESH_TRUNC;
break;
case 3:
thresholdType = THRESH_TOZERO;
break;
case 4:
thresholdType = THRESH_TOZERO_INV;
break;
default:
break;
}
//图像阈值化处理
threshold(g_srcGrayImage, g_dstImage, thresholdValue, binaryMaxValue, thresholdType);
imshow("图像阈值化处理", g_dstImage);
}
效果图.png
网友评论