您的位置:首页 > 其它

最大方差阈值分割(vc实现)

2013-04-18 15:53 148 查看
void CISLSView::OnThresholdOtsu()

 {

//程序编制:李立宗  lilizong@gmail.com

//2012-8-14

  if(myImage1.IsNull())

   OnOpenResourceFile();

  if(!myImage2.IsNull())

   myImage2.Destroy();

  if(myImage2.IsNull()){

   myImage2.Create(myImage1.GetWidth(),myImage1.GetHeight(),24,0);

  }

  //COLORREF pixel;

  int maxY = myImage1.GetHeight();

  int maxX=myImage1.GetWidth();

  byte* pRealData;

  byte* pRealData2;

  pRealData=(byte*)myImage1.GetBits();

  pRealData2=(byte*)myImage2.GetBits();

  int pit=myImage1.GetPitch();

  int pit2=myImage2.GetPitch();

  //需要注意,pit和pit2的值并不一样,所以如果使用一个值,会导致不同的结果出现

  //CString str;

  //str.Format(TEXT("%d"),pit);

  //MessageBox(str);

  //str.Format(TEXT("%d"),pit2);

  //MessageBox(str);

  int bitCount=myImage1.GetBPP()/8;

  int bitCount2=myImage2.GetBPP()/8;

  int tempR,tempG,tempB;

  //float temp,tempX,tempY;

  int temp;

  int T=128;

  //int pixel[4];

  float u0,u1;   //均值

  float w0,w1;   //概率

  float sum0,sum1;  //像素和

  int optIndex,optT;   //最优阈值,及其所在像素的值

  float fVaria,fMaxVaria=0;   //临时方差,最大方差

  int i;        //循环变量

  //int pixelR[256],pixelG[256],pixelB[256];

  int pixel[256]={0};   //不要忘记初始化

  for (int y=0; y<maxY-1; y++) {

   for (int x=0; x<maxX-1; x++) {

    temp=*(pRealData+pit*(y)+(x)*bitCount);

    if(bitCount==3)

    {

     tempR=*(pRealData+pit*(y)+(x)*bitCount);

     tempG=*(pRealData+pit*(y)+(x)*bitCount+1);

     tempB=*(pRealData+pit*(y)+(x)*bitCount+2);

     temp=(int)(tempR*0.49+tempG*0.31+tempB*0.2);

     //temp=(int)((tempR+tempG+tempB)/3);

    }

    

     *(pRealData2+pit2*(y)+(x)*bitCount2)=temp;

     *(pRealData2+pit2*(y)+(x)*bitCount2+1)=temp;

     *(pRealData2+pit2*(y)+(x)*bitCount2+2)=temp;

   }

  }

  for (int y=0; y<maxY; y++) {

   for (int x=0; x<maxX; x++) {

    temp=*(pRealData2+pit2*(y)+(x)*bitCount2);

    pixel[temp]++;

   }

  }

  //CString str;

  //str.Format(TEXT("%d"),pixel[3]);

  //MessageBox(str);

  for(optIndex=0;optIndex<256;optIndex++)

  {

   u0=0;

   sum0=0;

   for(i=0;i<=optIndex;i++)

   {

    u0+=i*pixel[i];

    sum0+=pixel[i];

   }

   u0/=sum0;

   w0=(float)(sum0)/(maxX*maxY);

   u1=0;

   sum1=0;

   for(i=optIndex;i<=255;i++)

   {

    u1+=i*pixel[i];

    sum1+=pixel[i];

   }

   u1/=sum1;

   w1=1-w0;

   fVaria=w0*w1*(u0-u1)*(u0-u1);

   if(fVaria>fMaxVaria)

   {

    fMaxVaria=fVaria;

    optT=optIndex;

   }

  }

  for (int y=0; y<maxY; y++) {

   for (int x=0; x<maxX; x++) {

    temp=*(pRealData2+pit2*(y)+(x)*bitCount2);

    if(temp>optT)

     tempR=255;

    else

     tempR=0;

     tempG=tempR;

     tempB=tempR;    

    *(pRealData2+pit2*y+x*bitCount2)=tempR;

    *(pRealData2+pit2*y+x*bitCount2+1)=tempG;

    *(pRealData2+pit2*y+x*bitCount2+2)=tempB;

   }

  }

  Invalidate();

 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: