本文主要介绍的是图像分割函数的意义及使用
涉及到的函数为threshold(),在下文代码段进行了详细的介绍。
图1表示了官方对阈值类型的介绍,图2表示的经过阈值处理之后的结果。
图1 阈值类型
图2 阈值分割结果
线性混合可表示如下:
dst = src1[I]*alpha+ src2[I]*beta + gamma;
/************************************************************************/
/*
OpenCV阈值分割函数:threshold()
函数原型:
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
参数含义:
InputArray src -原图像
OutputArray dst -输出图像
double thresh -阈值大小
double maxval -最大值
int type -阈值模式
阈值模式有以下几种类型
0: THRESH_BINARY -当前点值大于阈值时,取Maxval,否则设置为0
1: THRESH_BINARY_INV -当前点值大于阈值时,设置为0,否则设置为Maxval
2: THRESH_TRUNC -当前点值大于阈值时,设置为阈值,否则不改变
3: THRESH_TOZERO -当前点值大于阈值时,不改变,否则设置为0
4: THRESH_TOZERO_INV -当前点值大于阈值时,设置为0,否则不改变
*/
/************************************************************************/
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME "窗口"
//定义滑动条初始值
int g_nThresholdValue=100; //阈值初始值
int g_nThresholdType=0; //阈值模式初始值
Mat g_srcImage,g_grayImage,g_dstImage;
void on_Threshold(int ,void*);//声名回调函数
int main()
{
g_srcImage=imread("lena.jpg");//读入图片
if(!g_srcImage.data)
{
cout<<"读入错误"<<endl;
return -1;
}
//转换为灰度图
cvtColor(g_srcImage,g_grayImage,COLOR_RGB2GRAY);//更多转换方式参见官方文档
//显示原图
imshow("原图",g_srcImage);
//创建滑动条
namedWindow(WINDOW_NAME);
createTrackbar("模式",WINDOW_NAME,&g_nThresholdType,4,on_Threshold);
createTrackbar("阈值",WINDOW_NAME,&g_nThresholdValue,255,on_Threshold);
//使用回调函数显示图像
on_Threshold(0,0);
waitKey();
return 0;
}
void on_Threshold(int,void*)
{
//进行阈值分割
threshold(g_grayImage,g_dstImage,g_nThresholdValue,255,g_nThresholdType);
//显示结果
imshow(WINDOW_NAME,g_dstImage);
}
大津阈值和自适应阈值
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME "窗口"
Mat g_srcImage,g_grayImage,g_dstImage;
int main()
{
g_srcImage=imread("1.bmp");//读入图片
if(!g_srcImage.data)
{
cout<<"读入错误"<<endl;
return -1;
}
//转换为灰度图
cvtColor(g_srcImage,g_grayImage,COLOR_RGB2GRAY);//更多转换方式参见官方文档
//显示原图
imshow("原图",g_srcImage);
namedWindow(WINDOW_NAME);
//大津阈值
threshold(g_grayImage,g_dstImage,0,255,CV_THRESH_OTSU);
//自适应阈值
//adaptiveThreshold(g_grayImage,g_dstImage,255,0,0,7,9);
imshow(WINDOW_NAME,g_dstImage);
waitKey();
return 0;
}