注:应用于对每个数组一个固定阈值的。
函数适用于多通道数组的固定阈值,函数典型用于一个灰度图像输出的二进制图像(compare 函数也能达到这个目的),或者是为了消除噪声,由此过滤出太小的或者太大的像素。此函数提供了几种阈值类型,他们由参数type来决定。
特殊值THRESH_OTSU (大津法)或THRESH_TRIANGLE可以和以上值组合使用。在此类情况下,函数决定最优的阈值使用Otsu或 Triangle算法,并使用它替代确定的阈值。
注意: Otsu和Triangle法只能实现于8位单通道图像。
CV_EXPORTS_W double threshold( InputArray src, OutputArray dst,
double thresh, double maxval, int type );
参考 adaptiveThreshold, findContours, compare, min, max
#include
#include
int main() {
cv::Mat srcImg = cv::imread("D:\\OpenCVtest\\images\\juice.png");
// 转换为灰度图像,整成黑白效果的
cv::cvtColor(srcImg, srcImg, cv::COLOR_RGB2GRAY);
cv::Mat dstImgBinary, dstImgBinaryInv, dstImgTrunc;
cv::Mat dstImgTOZERO, dstImgTOZEROInv, dstImgOTSU, dstImgTRIANGLE;
cv::threshold(srcImg, dstImgBinary, 80, 255, cv::THRESH_BINARY);
cv::threshold(srcImg, dstImgBinaryInv, 80, 255, cv::THRESH_BINARY_INV);
cv::threshold(srcImg, dstImgTrunc, 80, 255, cv::THRESH_TRUNC);
cv::threshold(srcImg, dstImgTOZERO, 200, 255, cv::THRESH_TOZERO);
cv::threshold(srcImg, dstImgTOZEROInv, 200, 255, cv::THRESH_TOZERO_INV);
cv::threshold(srcImg, dstImgOTSU, 200, 255, cv::THRESH_OTSU);
cv::threshold(srcImg, dstImgTRIANGLE, 200, 255, cv::THRESH_TRIANGLE);
cv::imshow("binary", dstImgBinary);
cv::imshow("binaryInv", dstImgBinaryInv);
cv::imshow("Trunc", dstImgTrunc);
cv::imshow("TOZERO", dstImgTOZERO);
cv::imshow("TOZEROINV", dstImgTOZEROInv);
cv::imshow("OTSU", dstImgOTSU);
cv::imshow("TRIANGLE", dstImgTRIANGLE);
cv::waitKey(0);
return 0;
}
运行结果:
阈值化为0
反阈值化为0
截断阈值
二进制阈值
反二进制阈值
enum ThresholdTypes {
THRESH_BINARY = 0,
THRESH_BINARY_INV = 1,
THRESH_TRUNC = 2,
THRESH_TOZERO = 3,
THRESH_TOZERO_INV = 4,
THRESH_MASK = 7,
THRESH_OTSU = 8,
THRESH_TRIANGLE = 16
};
其详细解释如下表:
THRESH_BINARY | dst(x,y)=src(x,y)>thresh?maxval:0 |
---|---|
THRESH_BINARY_INV | dst(x,y)=src(x,y)>thresh?0:maxval |
THRESH_TRUNC | dst(x,y)=src(x,y)>thresh?thresh:src(x,y) |
THRESH_TOZERO | dst(x,y)=src(x,y)>thresh?src(x,y):0 |
THRESH_TOZERO_INV | dst(x,y)=src(x,y)>thresh?0:src(x,y) |
THRESH_MASK | |
THRESH_OTSU | flag, 使用 Otsu 算法去选择最优的阈值 |
THRESH_TRIANGLE | flag, 使用riangle算法去选择最又阈值 |