OpenCV阈值函数threshold函数的使用

:应用于对每个数组一个固定阈值的。

功能:

函数适用于多通道数组的固定阈值,函数典型用于一个灰度图像输出的二进制图像(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 );

参数释义:

  • 参数 src 输入数组 (多通道,8位或32位浮点数)。
  • 参数 dst 和输入数组同样大小、同样通道数、同样类型的数组。
  • 参数 thresh 阈值。
  • 参数 maxval 使用THRESH_BINARY 和THRESH_BINARY_INV阈值类型的最大值。
  • 参数 type 阈值类型 (参考ThresholdTypes)。
  • 返回在使用Otsu和Triangle方法计算出的阈值。

参考 adaptiveThreshold, findContours, compare, min, max

示例源码:

#include <iostream>
#include <opencv2/opencv.hpp>

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
在这里插入图片描述
截断阈值
在这里插入图片描述
二进制阈值
在这里插入图片描述
反二进制阈值

在这里插入图片描述

大津法OTSU
在这里插入图片描述
图像二值寻找算法 – TRIANGLE
在这里插入图片描述

附注:ThresholdTypes

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算法去选择最又阈值

猜你喜欢

转载自blog.csdn.net/jndingxin/article/details/112983577