目录
1 概念讲解
大律法(OTSU)和三角法(TRIANGLE)都是基于全局阈值的图像二值化方法,它们通过计算图像灰度直方图的特征值来选择一个合适的全局阈值,将图像转换为二值图像。这两种方法可以广泛应用于边缘检测、目标分割、图像处理等领域。
2 数学原理及数学推导公式
2.1 大律法(Otsu's Method)
大律法基于最小化类间方差的原则选择全局阈值。具体数学原理和推导如下:
假设图像的灰度级别为L,对应的概率密度函数为,定义总平均灰度为,背景0的概率为,前景1的概率为,背景0的平均灰度为,前景1的平均灰度为。
背景0:[0, t],前景1:(t, L-1]。
背景0的概率:
前景1的概率:
背景0的平均灰度:
前景1的平均灰度:
总平均灰度:
则类间方差可表示为:
大律法选择使类间方差最大的阈值作为全局阈值。
在opencv中利用cv::threshold(image, otsuBinaryImage, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU)来使用OTSU算法。
2.2 三角法(Triangle Method)
三角法基于直方图中的三角形特性选择全局阈值。具体数学原理如下:
对图像的灰度直方图进行归一化处理,得到直方图函数h(i),其中i为灰度级别。通过连接(0,0)和(L-1, h(L-1))两点,形成直方图的边界线段。在直方图上从最高峰处bmx到最暗对应直方图bmin构造一条直线,从bmin处开始计算每个对应的直方图b到直线的垂直距离,直到bmax为止,其中最大距离对应的直方图位置即为图像二值化对应的阈值T。
在opencv中利用cv::threshold(image, otsuBinaryImage, 0, 255, cv::THRESH_BINARY | cv::THRESH_TRIANGLE)来使用三角法算法。三角法适用于灰度直方图为单峰的图像。
3 代码实现
下面是一个示例代码,展示了如何使用OpenCV C++进行大律法和三角法图像二值化的代码实现:
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 读取灰度图像
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
// 定义变量存储大律法和三角法的二值化结果
cv::Mat otsuBinaryImage, triangleBinaryImage;
// 执行大律法的二值化操作
cv::threshold(image, otsuBinaryImage, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
// 执行三角法的二值化操作
double triangleThreshold = cv::threshold(image, triangleBinaryImage, 0, 255, cv::THRESH_BINARY | cv::THRESH_TRIANGLE);
// 显示原图和二值化结果
cv::imshow("Original Image", image);
cv::imshow("Otsu's Binary Image", otsuBinaryImage);
cv::imshow("Triangle Binary Image", triangleBinaryImage);
cv::waitKey(0);
return 0;
}