CV基础(2):OSTU算法

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

3、Reference

详细及易读懂的大津法原理和实现

posted @ 2019-07-18 09:21  ningKing  阅读(1280)  评论(0编辑  收藏  举报