迭代的(最优的)阈值选择法进行图像分割

这种方法假设图像中出现了两种主要的灰度区域。

算法描述:

迭代的(最优的)阈值选择:

1、假设没有有关物体确切位置的知识,作为第一步近似,考虑图像四角含有背景像素而其他部分含有物体像素。

2、在第t步,分别计算背景和物体的灰度均值wps_clip_image-123wps_clip_image-166,其中在第t步将图像分割为背景和物体的阈值是wps_clip_image-230,它是在前一步确定的[公式(5.9)]:

wps_clip_image-293=wps_clip_image-336wps_clip_image-380=wps_clip_image-423                        (5.8)

3、设

wps_clip_image-497                                                  (5.9)

wps_clip_image-595提供了一个更新了的背景与物体的区分。

4、如果wps_clip_image-660=wps_clip_image-703则停止;否则返回第2步。

 

代码实现:

void main()
{
    byte [,] Img = LoadImg();
    if (Img==null) return;

    ShowImg("",Img);

    int w = Img.GetLength(0);
    int h = Img.GetLength(1);

    byte [,] newImg = new byte[w,h];
    byte temp = 0, T = 0;//T is the threshold
    double ub = 0, uo = 0;//ub is the mean value of backgroud, uo is the mean value
                                              //of the object
    double nUb = 0, nUo = 0;//nUb is the number of pixels in the backgroud region, nUo
                                                //is is the number of pixels in the object region
    nUb = 4;
    nUo = w * h - 4;
    ub = ( Img[0,0] + Img[0, w-1] + Img[h-1,0] + Img[h-1, w-1] ) / nUb;
    for (int y=0;y

           for (int x=0;x

          {
                uo += Img[x,y];
            }
    uo -= ub;
    uo /= nUo;
    T = (byte)((ub + uo) / 2);
    while(temp!=T)
    {
        ub = 0;
        uo = 0;
        nUb = 0;
        nUo = 0;
        for (int y=0;y

      {
            for (int x=0;x

      {
                if(Img[x,y] < T)//if f(i,j)

               {
                    ub += Img[x,y];
                    nUb++;
                }
                else
                {
                    uo += Img[x,y];
                    nUo++;
                }
            }
        }   
        ub /= nUb;
        uo /= nUo;
        temp = T;
        T = (byte)((ub + uo) / 2);   
    }
    for (int y=0;y

   {
            for (int x=0;x

           {
                if(Img[x,y] >= T) newImg[x,y] = 255;
                else newImg[x,y] = 0;
            }
    }
    ShowImg("Edge detecting",newImg);
}

//该代码执行时对一些图片会出现错误情况,尚不清楚原因???

算法描述详见《图像处理、分析与机器视觉(第二版)》Milan Sonka, Vaclav Hlavac, Roger Boyle著,艾海舟、武勃等译,人民邮电出版社,2003年9月第1版,第87页

你可能感兴趣的:(图像处理,byte,图像处理,object,算法,出版,null)