DSP

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

2019-07-13 15:18发布



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; yfMaxVaria) { fMaxVaria=fVaria; optT=optIndex; } } for (int y=0; yoptT) 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(); }