double cv::threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type )
二值化方法可选择的标志及含义
标志参数 | 作用 |
---|---|
THRESH_BINARY | 灰度值大于阈值的为最大值,其他值为 0 |
THRESH_BINARY_INV | 灰度值大于阈值的为 0,其他值为最大值 |
THRESH_TRUNC | 灰度值大于阈值的为阈值,其他值不变 |
THRESH_TOZERO | 灰度值大于阈值的不变,其他值为 0 |
THRESH_TOZERO_INV | 灰度值大于阈值的为 0,其他值不变 |
THRESH_OTSU | 大津法自动寻求全局阈值 |
THRESH_TRIANGLE | 三角形法自动寻求全局阈值 |
为了方便讲解,我们使用如下的一个图像,红色表示图像,黑色是图像的边界,蓝色是阈值
原图
公式:
对于原图,如果我们进行二值化操作,那么蓝色的线以上的,都变成最大值,蓝色的线以下的线都变成0
公式:
对于原图,如果我们进行反二值化操作,那么蓝色的线以下的,都变成最大值,蓝色的线以上的线都变成0
公式:
对于原图,如果我们进行截断操作
公式:
对于原图,如果我们进行操作
公式:
对于原图,如果我们进行操作
参考:【opencv学习笔记】015之基本阈值操作_最大阈值和最小阈值公式-CSDN博客
#include #include #include using namespace std; using namespace cv; int main() { Mat img = imread("../pic/gril_1.jpg"); if (img.empty()) { cout << "请确认图像文件名称是否正确" << endl; return -1; } imshow("原画", img); Mat gray; double a , b ,c ,d ; cvtColor(img, gray, COLOR_BGR2GRAY); Mat img_B, img_B_V, gray_B,gray_B_V, gray_T, gray_T_V, gray_TRUNC ; //彩色图像二值化 threshold(img, img_B, 125, 255, THRESH_BINARY); threshold(img, img_B_V, 125, 255, THRESH_BINARY_INV); imshow("img_B", img_B); imshow("img_B_V", img_B_V); //灰度图 BINARY 二值化 threshold(gray, gray_B, 125, 255, THRESH_BINARY); threshold(gray, gray_B_V, 125, 255, THRESH_BINARY_INV); imshow("gray_B", gray_B); imshow("gray_B_V", gray_B_V); //灰度图像 TOZERO 变换 threshold(gray, gray_T, 125, 255, THRESH_TOZERO); threshold(gray, gray_T_V, 125, 255, THRESH_TOZERO_INV); imshow("gray_T", gray_T); imshow("gray_T_V", gray_T_V); //灰度图像 TRUNC 变换 threshold(gray, gray_TRUNC, 125, 255, THRESH_TRUNC); imshow("gray_TRUNC", gray_TRUNC); waitKey(0); return 0; }
结果:
void cv::adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C )
第一种ADAPTIVE_THRESH_MEAN_C
,针对像素(x,y)的计算方式如下:
T(x,y)结果是在(x,y)的邻域blockSize×blockSize范围内所有灰度值的均值减去第7个参数double C;
第二种ADAPTIVE_THRESH_GAUSSIAN_C
,针对像素(x,y)的计算方式如下:
#include #include #include using namespace std; using namespace cv; int main() { //灰度图像大津法和三角形法二值化 Mat img_Thr = imread("../pic/gril_2.png", IMREAD_GRAYSCALE); double a ,b ,c,d ; if (img_Thr.empty()) { cout << "请确认图像文件名称是否正确" << endl; return -1; } //cvtColor(img_Thr, img_Thr, COLOR_BGR2GRAY); Mat img_Thr_O, img_Thr_O_1,img_Thr_T,img_Thr_T_1; a = threshold(img_Thr, img_Thr_O, 100, 255, THRESH_BINARY | THRESH_OTSU); b = threshold(img_Thr, img_Thr_T, 125, 255, THRESH_BINARY | THRESH_TRIANGLE); c = threshold(img_Thr, img_Thr_O_1, 150, 255, THRESH_BINARY | THRESH_OTSU); d = threshold(img_Thr, img_Thr_T_1, 200, 255, THRESH_BINARY | THRESH_TRIANGLE); cout << "333 a =" <
结果:threshold函数不管设置的阈值是多少,只要有THRESH_OTSU 和 THRESH_TRIANGLE,就会重新匹配该照片的阈值
adaptiveThreshold函数可参考: OpenCV-C++ 图像自适应阈值二值化处理adaptiveThreshold - chenzhen0530 - 博客园 (cnblogs.com)