- 主要内容
图像阈值
阈值类型
二值化分割——五种方式的算法了解
寻找阈值 ——两种方式的算法了解 - 阈值(threshold)
简单点说是把图像分割的标尺,我们也可以自己设定阈值的大小。
OpenCV提供两种阈值产生算法 - 阈值的类型
(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)值的分布情况,蓝色水平线表示阈值
-
类型表示汇总
前五种分别是不同类型的阈值方法
最后两种是产生阈值的方法
注意事项:
使用 THRESH_OTSU 和 THRESH_TRIANGLE做阈值的时候,图像只能是8位单通道的图像(灰度图),否则程序报错 -
相关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:此处填写不同阈值方法的宏
- 最终代码
#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);
*/