15.基本阈值操作
- 主要内容
图像阈值
阈值类型
二值化分割——五种方式的算法了解
寻找阈值 ——两种方式的算法了解 - 阈值(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
#include 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);*/
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
