OpenCV - 最大熵分割

图像分割系列的博客陆陆续续写了好几篇了,这次继续写写利用最大熵模型来进行图像的阈值分割。如果对其他相关博客感兴趣可进入下面的链接查看: 
1. OpenCV - 区域生长算法 
2. OpenCV - 均值迭代分割 
3. OpenCV - 最大间方差(OTUS)分割 
4. OpenCV - 最大熵分割

1. 最大熵是什么?

这里所说的熵是指信息熵信息熵是来自于信息论的一个词,它是对系统所含信息的一种度量。通俗的讲,系统的不确定性越大,那么系统的信息熵就越大。反之,一个系统如果确定性高(系统越有序),那么整个系统的信息熵就越小。其数学定义表述如下: 

H=+p(x)log[p(x)]dx

上式中, p(x)  表示灰度  x  出现的频率。 H  则表示信息熵。

2. 最大熵图像分割

算法描述如下: 
1. 选取一个阈值 T ,使用该阈值将图像中的所有像素点分成两类,低于阈值 T 的所有像素记为背景B,高于阈值 T 的所有像素记为物体O。 
2. 计算每个灰度级在B或者O类中所占的概率。 
背景:

pipT,i=1,2,...,T

物体:
pi1pT,i=T+1,T+2,...,L

其中
pT=i=0Tp(i)
。 
3. 分别计算背景和物体的信息熵 
HB=ipiptlog[pipt],i=1,2,...,T

HO=ipi1ptlog[pi1pt],i=T+1,T+2,...,L

4. 对图像中的每一个灰度级进行步骤1-3运算,得到使 max(HO+HB) 时的T值,该值即为最大熵的分割点。

3.在OpenCV平台进行实现

/***************************************************************************************
Function: 最大熵分割算法
Input:    Mat 待分割的原图像
Output:   分割后图像
***************************************************************************************/
Mat EntropySeg(Mat src)
{
    int tbHist[256] = {0};                                          //每个像素值个数
    int index = 0;                                                  //最大熵对应的灰度
    double Property = 0.0;                                          //像素所占概率
    double maxEntropy = -1.0;                                       //最大熵
    double frontEntropy = 0.0;                                      //前景熵
    double backEntropy = 0.0;                                       //背景熵
    //纳入计算的总像素数
    int TotalPixel = 0;                                             
    int nCol = src.cols * src.channels();                           //每行的像素个数
    for (int i = 0; i < src.rows; i++)
    {
        uchar* pData = src.ptr<uchar>(i);
        for (int j = 0; j < nCol; ++j)
        {
            ++TotalPixel;
            tbHist[pData[j]] += 1;
        }
    }

    for (int i = 0; i < 256; i++) 
    {
        //计算背景像素数
        double backTotal = 0;
        for (int j = 0; j < i; j++)
        {
            backTotal += tbHist[j];
        }

        //背景熵
        for (int j = 0; j < i; j++)
        {
            if (tbHist[j] != 0)
            {
                Property = tbHist[j] / backTotal;
                backEntropy += -Property * logf((float)Property);
            }
        }
        //前景熵
        for (int k = i; k < 256; k++)
        {
            if (tbHist[k] != 0)
            {
                Property = tbHist[k] / (TotalPixel - backTotal);
                frontEntropy += -Property * logf((float)Property);
            }
        }

        if (frontEntropy + backEntropy > maxEntropy)    //得到最大熵
        {
            maxEntropy = frontEntropy + backEntropy;
            index = i;
        }
        //清空本次计算熵值
        frontEntropy = 0.0;
        backEntropy = 0.0;
    }
    Mat dst;
    //index += 20;
    cv::threshold(src, dst, index, 255, 0);             //进行阈值分割
    return dst.clone();
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV-Python提供了多种模型分割的算法,包括基于图像颜色空间的分割、基于形态学操作的分割、基于阈值的分割、基于边缘检测的分割以及基于机器学习的分割。下面我将简单介绍其中几种常用的模型分割算法。 1. 基于阈值的分割:这是最简单的图像分割算法,其基本思想是将图像根据像素灰度值的大小关系进行分割OpenCV-Python提供了多种阈值分割的方法,包括全局阈值、自适应阈值、Otsu阈值等。 2. 基于形态学操作的分割:形态学操作是一种基于图像形状和结构的处理方法。OpenCV-Python提供了多种形态学操作,包括膨胀、腐蚀、开操作、闭操作等,这些操作可以用于去除噪声、填充空洞、分离物体等。 3. 基于边缘检测的分割:边缘是图像中物体和背景之间的分界线,因此边缘检测可以用于分割图像。OpenCV-Python提供了多种边缘检测算法,包括Sobel、Canny、Laplacian等。 4. 基于机器学习的分割:这种方法需要事先训练一个分类器,然后用分类器对图像进行分割OpenCV-Python提供了多种机器学习算法,包括支持向量机、随机森林、神经网络等。这些算法可以用于图像分类、目标检测、物体识别等应用。 以上是常用的几种模型分割算法,你可以根据具体的应用场景选择合适的算法。同时,OpenCV-Python还提供了多种图像处理函数和工具,可以帮助你快速实现图像分割功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值