threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);
src:输入图,只能输入单通道图像,通常来说为灰度图
dst:输出图,一般为二值图像
thresh:阈值
maxval:当像素值超过了阈值(或者小于阈值,根据type来决定)所赋予的值
type:二值化操作的类型,包含以下5种类型
阈值分割类型 THRESH_BINARY = 0, // 大于thresh 为 maxval,否则为 0 THRESH_BINARY_INV = 1,// 大于thresh 为 0,否则为 maxval THRESH_TRUNC = 2, // 大于thresh 为 thresh,否则为 0 THRESH_TOZERO = 3, // 大于thresh ?不变,否则为 0 THRESH_TOZERO_INV = 4, // 大于thresh 为 0,否则 不变
程序
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//全局变量
Mat dst, dst1, dst2;
//载入原图
Mat src = imread("12.bmp", 1);
int method=1;
int thresh=100;
void on_change(int, void*)
{
dst = Mat::zeros(src.size(), src.type());
threshold(src, dst, thresh, 255, method);
imshow("【原始图像】", src);
imshow("【二值图像】", dst);
}
void print()
{
cout << "阈值分割类型:" << endl;
cout << "THRESH_BINARY = 0, // 大于thresh 为 maxval,否则为 0" << endl;
cout << "THRESH_BINARY_INV = 1,// 大于thresh 为 0,否则为 maxval" << endl;
cout << "THRESH_TRUNC = 2, // 大于thresh 为 thresh,否则为 0" << endl;
cout << "THRESH_TOZERO = 3, // 大于thresh ?不变,否则为 0" << endl;
cout << "THRESH_TOZERO_INV = 4, // 大于thresh 为 0,否则 不变" << endl;
}
int main()
{
print();
//改变console(控制台)字体颜色
system("color 0B");
//判断图片是否读入
if (!src.data)
{
printf("读取图片image0错误~! \n");
return false;
}
//将图片转为灰度图
cvtColor(src, src, COLOR_BGR2GRAY);
//先显示原图
namedWindow("【原始图像】");
imshow("【原始图像】", src);
//循环轮询按键
while (1)
{
//获取键盘按键
int c = waitKey(0);
//判断ESC是否按下,若按下便退出
if ((c & 255) == 27)
{
cout << "程序退出!\n";
break;
}
createTrackbar("【阈值】", "【原始图像】", &thresh,255, on_change);
createTrackbar("【阈值分割类型】", "【原始图像】", &method, 4, on_change);
on_change(0, 0);
}
return 0;
}
?
?
|