在C++中实现Python的OpenCV阈值代码,thresh指代什么?
OpenCV C++ 实现Python阈值代码及相关说明
1. 先明确thresh的含义
在你给出的Python代码里,cv2.threshold()会返回两个结果:第一个是OTSU算法自动计算出的阈值数值,第二个就是经过二值化处理后的图像矩阵(对应C++里的cv::Mat),也就是代码里的thresh。
它是原灰度图经过反二值化+OTSU自动阈值处理后的产物:原灰度图中低于自动阈值的像素会被设为255,高于阈值的像素设为0(因为用了THRESH_BINARY_INV),目的是把精灵区域和背景区分开,方便后续裁剪。
2. 对应的C++代码实现
OpenCV C++版本的threshold函数和Python的逻辑一致,但调用方式不同——它不会返回元组,而是通过参数传递输出图像,函数返回值是自动计算的阈值。代码如下:
// 假设gray是已经加载好的单通道灰度图(cv::Mat类型) cv::Mat thresh; // 执行阈值处理,结果存入thresh,otsu_threshold是自动算出的阈值 double otsu_threshold = cv::threshold(gray, thresh, 0, 255, cv::THRESH_BINARY_INV + cv::THRESH_OTSU);
参数说明:
gray:输入的单通道灰度图像thresh:输出的二值化图像,也就是你要的和Python里thresh等价的结果0:因为用了OTSU算法,这个值会被忽略,由算法自动计算阈值255:二值化后的像素最大值cv::THRESH_BINARY_INV + cv::THRESH_OTSU:和Python参数完全对应,启用反二值化+OTSU自动阈值模式
3. C++与Python中Mat的差异说明
- Python里
cv2.threshold返回元组,需要用[1]提取二值图;C++里直接定义一个cv::Mat变量作为输出参数传入函数,执行后该变量就会被填充为处理后的图像 - C的
cv::Mat不需要下标操作来获取结果,后续对thresh的处理(比如找轮廓、裁剪精灵)直接调用OpenCV的C接口即可,逻辑和Python一致
内容的提问来源于stack exchange,提问作者Rahul Iyer
相关产品推荐
相关产品推荐

