Otsu算法是一种基于像素特征的算法,它采用最大类间阈值分割图像为前景和背景两部分,所以是一种基于全局特征的算法,对目标单一的图像分割效果较好,对多目标图像 此方法往往无能为力
1、OTSU算法原理
最大类间方差是由日本学者大津(Nobuyuki Otsu)于1979年提出,是一种自适应的阈值确定方法。算法假设图像像素能够根据阈值,被分成背景[background]和目标[objects]两部分。然后,计算使得两类像素类间方差最大(区分度最大)的像素值,该像素值就是分割阈值。
推导过程: 记 M = 256 单通道灰度分级 Sum = 像素总数
- 背景像素占比:
- 前景像素占比:
- 背景的平均灰度值:
- 前景的平均灰度值:
- 灰度图像整体累计值:
- 前景、背景类间方差:
将公式3.4.5带入公式6 可得最终简化公式:
2、基于OpenCV的实现代码
基于VS2017 + OepnCV4.10
Mat base = imread(".//test//1.jpg");
Mat grey;
cvtColor(base, grey, COLOR_RGB2GRAY);
Mat seg;
long timeStart = clock();
uint32_t thresh = threshold(grey, seg, 0, 255, THRESH_OTSU);
long timeFinish = clock();
cout << "Calculating time: " << timeFinish - timeStart << endl;
imshow("Origin", base);
imshow("Middle", seg);
imshow("Result", grey);
cout << "The threshold is: " << thresh << endl;
waitKey(0);
运行结果:
test.gif