double cv::threshold(
InputArray src,
OutputArray dst,
double thresh,
double maxval,
int type
)
threshold()将固定阈值应用于多通道图像阵列,通常用于从灰度图像中获得二值图像或用于去除噪声,即滤除值过小或过大的像素。该函数支持几种类型的阈值设置,它们由类型参数决定。
src:输入数组(多通道,8位或32位浮点数)
dst:输出数组(与src的尺寸、类型、通道数相同)
thresh:阈值
maxval:最大值
type:阈值类型
如果使用Otsu或Triangle方法,将返回计算出的阈值。
THRESH_BINARY(二值化阈值处理):
THRESH_BINARY_INV(反二值化阈值处理):
THRESH_TRUNC(截断阈值处理):
THRESH_TOZERO(截断为零阈值处理):
THRESH_TOZERO_INV(反截断为零阈值处理):
(上述回答来自ChatGPT)
特殊值THRESH_OTSU或THRESH_TRIANGLE可以与上述值中的一个组合。在这些情况下,函数使用Otsu's或Triangle算法确定最佳阈值,并使用它而不是指定的阈值。
THRESH_OTSU与THRESH_TRIANGLE分别使用Otsu和Triangle算法选择最佳阈值。
#include
#include
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat img = imread("path");
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
Mat imgB, imgBInv, imgTrunc, imgTZ, imgTZInv;
// 也可进行彩色图像的阈值化
threshold(gray, imgTrunc, 125, 255, THRESH_TRUNC);
threshold(gray, imgB, 125, 255, THRESH_BINARY);
threshold(gray, imgBInv, 125, 255, THRESH_BINARY_INV);
threshold(gray, imgTrunc, 125, 255, THRESH_TRUNC);
threshold(gray, imgTZ, 125, 255, THRESH_TOZERO);
threshold(gray, imgTZInv, 125, 255, THRESH_TOZERO_INV);
// 使用Otsu算法
// threshold(gray, imgB, 125, 255, THRESH_BINARY | THRESH_OTSU);
imshow("gray", gray);
imshow("imgTrunc", imgTrunc);
imshow("imgB", imgB);
imshow("imgBInv", imgBInv);
imshow("imgTZ", imgTZ);
imshow("imgTZInv", imgTZInv);
waitKey(0);
}
void cv::adaptiveThreshold (
InputArray src,
OutputArray dst,
double maxValue,
int adaptiveMethod,
int thresholdType,
int blockSize,
double C
)
对图像阵列应用自适应阈值,该函数根据公式将灰度图像变换为二值图像:
其中T(x,y)是针对每个像素单独计算的阈值。
src:八位单通道图像
dst:与src尺寸和类型相同的目标图像
maxValue:赋给满足条件的像素的非零值
adaptiveMethod:使用的自适应阈值算法
thresholdType:阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV
blockSize:用于计算像素阈值的像素邻域大小:3,5,7......
C:从平均值或加权平均值中减去的常数。通常,它是正的。
#include
#include
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat img = imread("path");
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
Mat imgB, imgMean, imgGaussian;
threshold(gray, imgB, 125, 255, THRESH_BINARY);
// adaptiveThreshold() 只能接受灰度图像
adaptiveThreshold(gray, imgMean, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 7, 0);
adaptiveThreshold(gray, imgGaussian, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 7, 0);
imshow("gray", gray);
imshow("imgB", imgB);
imshow("imgMean", imgMean);
imshow("imgGaussian", imgGaussian);
waitKey(0);
}