使用OpenCV C++进行图像二值化操作

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

阈值操作的类型

使用OpenCV C++进行图像二值化操作_第1张图片

使用OpenCV C++进行图像二值化操作_第2张图片

  1. THRESH_BINARY(二值化阈值处理):

    • THRESH_BINARY方法将图像中的像素值与给定的阈值进行比较,大于等于阈值的像素被设置为一个最大值(通常为255),小于阈值的像素被设置为0。
    • 最佳用途:适用于分离目标物体和背景,或者在需要检测物体边缘时,可以用于边缘检测。
  2. THRESH_BINARY_INV(反二值化阈值处理):

    • THRESH_BINARY_INV与THRESH_BINARY相反,大于等于阈值的像素被设置为0,小于阈值的像素被设置为最大值。
    • 最佳用途:适用于与THRESH_BINARY相反的情况,或者在需要突出物体的特定区域时,可以用于增强物体的特征。
  3. THRESH_TRUNC(截断阈值处理):

    • THRESH_TRUNC方法保留小于等于阈值的像素值,而大于阈值的像素值被设置为阈值。
    • 最佳用途:适用于保留图像中的某个范围内的像素值,可以用于增强图像的对比度。
  4. THRESH_TOZERO(截断为零阈值处理):

    • THRESH_TOZERO方法保留大于等于阈值的像素值,小于阈值的像素值被设置为零。
    • 最佳用途:适用于突出图像中的亮部分,可以用于增强图像的亮部细节。
  5. THRESH_TOZERO_INV(反截断为零阈值处理):

    • THRESH_TOZERO_INV与THRESH_TOZERO相反,大于等于阈值的像素值被设置为零,小于阈值的像素值保持不变。
    • 最佳用途:适用于突出图像中的暗部分,可以用于增强图像的暗部细节。

 (上述回答来自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);
}

运行结果:

使用OpenCV C++进行图像二值化操作_第3张图片

 adaptiveThreshold()

void cv::adaptiveThreshold 	( 	
        InputArray  src,
		OutputArray dst,
		double  	maxValue,
		int  	     adaptiveMethod,
		int  	    thresholdType,
		int  	    blockSize,
		double  	C 
	) 	

对图像阵列应用自适应阈值,该函数根据公式将灰度图像变换为二值图像:

使用OpenCV C++进行图像二值化操作_第4张图片

 其中T(x,y)是针对每个像素单独计算的阈值。

参数

src:八位单通道图像

dst:与src尺寸和类型相同的目标图像

maxValue:赋给满足条件的像素的非零值

adaptiveMethod:使用的自适应阈值算法

thresholdType:阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV

blockSize:用于计算像素阈值的像素邻域大小:3,5,7......

C:从平均值或加权平均值中减去的常数。通常,它是正的。

AdaptiveThresholdTypes

测试代码:

#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);
}

运行结果:

你可能感兴趣的:(OpenCV,opencv,c++,图像处理)