基于阈值方法的大津法(OTSU算法)---图像分割
主要分为三部分去实现:
1.基本概念
大津法:属于阈值分割的范畴。阈值分割方法:利用图像中要提取的目标物体和背景在灰度上的差异,选择一个合适的阈值,通过判断每一个像素点的特征属性来确定该像素点属于目标区还是背景区域,从而产生二值图像。确定一个最优阈值是分割的关键
其确定阈值的过程为:记为前景与背景的分割阈值t.前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1;图像的总平均灰度为u=wo*u0+w1*u1:从最小到最大灰度值遍历t,当使得类间方差值a=w0*(u1-u)^2+w1*(u0-u)^2最大时,即为分割的最佳阈值。
对大津法可作如下理解:该式实际上就是类间方差值,阈值t分割出的前景和背景两部分构成了整幅图像,而前景取值u0,概率为w0,背景取值u1,概率为w1,总均值为u
2代码如下及其算法:
OTSU算法步骤如下:
❶统计灰度级中每个像素在整幅图像中的个数
❷计算每个像素在整幅图像的概率分布
❸对灰度级进行遍历搜索,计算当前灰度值下前景背景类间概率
❹通过目标函数计算类内与类间方差下对应阈值
代码如下:(代码源自朱伟老师著书籍《opencv图像处理编程实例》)
#include <stdio.h>
#include <string>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
using namespace std;using namespace cv;
// 大津法函数实现
int OTSU(cv::Mat srcImage)//srcImage为主函数传送来的灰度图像
{
int nCols = srcImage.cols;
//获取灰度图像的列数
int nRows = srcImage.rows;
//获取灰度图像的行数
//上述两个数值相乘的结果就是像素总数
int threshold = 0;
//这个参数用来返回 最终得到的最佳阈值
// 初始化统计参数
int nSumPix[256];//用来存放统计灰度级中每个像素在整幅图中的个数
float nProDis[256];//用来存放每个灰度级占整个图像的概率
for (int i = 0; i < 256; i