opencv+c++Otsu大津法
时间: 2023-07-01 10:09:56 浏览: 174
大津法(Otsu's method)是一种基于图像的直方图分析的自适应阈值分割方法,常用于二值化处理。下面是使用OpenCV和C++实现Otsu大津法的代码示例:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("image.jpg", 0); // 读入灰度图像
int T = 0; // 阈值
double max_var = 0; // 最大类间方差
// 计算图像直方图并归一化
Mat hist;
calcHist(&src, 1, nullptr, Mat(), hist, 1, &histSize, &histRange);
normalize(hist, hist, 0, 255, NORM_MINMAX, CV_8UC1);
// 遍历所有灰度级
for (int i = 0; i < 256; i++)
{
// 分割成两个类
Mat mask1 = src > i;
Mat mask2 = src <= i;
// 计算两个类的像素数和像素值总和
double w1 = countNonZero(mask1);
double w2 = countNonZero(mask2);
double sum1 = sum(src.mul(mask1))[0];
double sum2 = sum(src.mul(mask2))[0];
// 计算两个类的均值和方差
double u1 = sum1 / w1;
double u2 = sum2 / w2;
double var = w1 * w2 * (u1 - u2) * (u1 - u2);
// 更新最大类间方差和阈值
if (var > max_var)
{
max_var = var;
T = i;
}
}
// 二值化处理
Mat dst;
threshold(src, dst, T, 255, THRESH_BINARY);
// 显示原图和二值化结果
imshow("src", src);
imshow("dst", dst);
waitKey();
return 0;
}
```
以上代码中,通过计算每个灰度级作为阈值时的类间方差,从而选择最佳阈值进行二值化处理。最终的二值化结果保存在dst中。
阅读全文