threshold()
double cv::threshold(
InputArray src,
OutputArray dst,
double thresh,
double maxval,
int type
)
threshold()将固定阈值应用于多通道图像阵列,通常用于从灰度图像中获得二值图像或用于去除噪声,即滤除值过小或过大的像素。该函数支持几种类型的阈值设置,它们由类型参数决定。
参数
src:输入数组(多通道,8位或32位浮点数)
dst:输出数组(与src的尺寸、类型、通道数相同)
thresh:阈值
maxval:最大值
type:阈值类型
返回值
如果使用Otsu或Triangle方法,将返回计算出的阈值。
ThresholdTypes
阈值操作的类型
-
THRESH_BINARY(二值化阈值处理):
- THRESH_BINARY方法将图像中的像素值与给定的阈值进行比较,大于等于阈值的像素被设置为一个最大值(通常为255),小于阈值的像素被设置为0。
- 最佳用途:适用于分离目标物体和背景,或者在需要检测物体边缘时,可以用于边缘检测。
-
THRESH_BINARY_INV(反二值化阈值处理):
- THRESH_BINARY_INV与THRESH_BINARY相反,大于等于阈值的像素被设置为0,小于阈值的像素被设置为最大值。
- 最佳用途:适用于与THRESH_BINARY相反的情况,或者在需要突出物体的特定区域时,可以用于增强物体的特征。
-
THRESH_TRUNC(截断阈值处理):
- THRESH_TRUNC方法保留小于等于阈值的像素值,而大于阈值的像素值被设置为阈值。
- 最佳用途:适用于保留图像中的某个范围内的像素值,可以用于增强图像的对比度。
-
THRESH_TOZERO(截断为零阈值处理):
- THRESH_TOZERO方法保留大于等于阈值的像素值,小于阈值的像素值被设置为零。
- 最佳用途:适用于突出图像中的亮部分,可以用于增强图像的亮部细节。
-
THRESH_TOZERO_INV(反截断为零阈值处理):
- THRESH_TOZERO_INV与THRESH_TOZERO相反,大于等于阈值的像素值被设置为零,小于阈值的像素值保持不变。
- 最佳用途:适用于突出图像中的暗部分,可以用于增强图像的暗部细节。
(上述回答来自ChatGPT)
特殊值THRESH_OTSU或THRESH_TRIANGLE可以与上述值中的一个组合。在这些情况下,函数使用Otsu's或Triangle算法确定最佳阈值,并使用它而不是指定的阈值。
THRESH_OTSU与THRESH_TRIANGLE分别使用Otsu和Triangle算法选择最佳阈值。
测试代码:
#include <opencv2/opencv.hpp>
#include <iostream>
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);
}
运行结果:
adaptiveThreshold()
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:从平均值或加权平均值中减去的常数。通常,它是正的。
AdaptiveThresholdTypes
文章来源:https://www.toymoban.com/news/detail-775131.html
测试代码:
#include <opencv2/opencv.hpp>
#include <iostream>
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);
}
运行结果:
文章来源地址https://www.toymoban.com/news/detail-775131.html
到了这里,关于使用OpenCV C++进行图像二值化操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!