区域增长法(vc实现)

时间:2021-03-01 11:45:35

通过在图像上单击,获取当前点像素,然后根据当前像素进行像素区间的选择。


void CISLSView::OnLButtonDown(UINT nFlags, CPoint point){
//程序编制:李立宗 lilizong@gmail.com
//2012-8-14
if(flag)
{
flag = FALSE;
CISLSDoc *pDoc = GetDocument();
regionGrow(point);
}
//CView::OnLButtonDown(nFlags, point);
}


// 区域增长
void CISLSView::regionGrow(CPoint point)
{
if(myImage1.IsNull())
OnOpenResourceFile();
if(!myImage2.IsNull())
myImage2.Destroy();
if(myImage2.IsNull()){
myImage2.Create(myImage1.GetWidth(),myImage1.GetHeight(),24,0);
}
if(myImage3.IsNull()){
myImage3.Create(myImage1.GetWidth(),myImage1.GetHeight(),24,0);
}
//COLORREF pixel;
int maxY = myImage1.GetHeight();
int maxX=myImage1.GetWidth();
byte* pRealData;
byte* pRealData2;
byte* pRealData3;
pRealData=(byte*)myImage1.GetBits();
pRealData2=(byte*)myImage2.GetBits();
pRealData3=(byte*)myImage3.GetBits();
int pit=myImage1.GetPitch();
int pit2=myImage2.GetPitch();
int pit3=myImage3.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 bitCount3=myImage3.GetBPP()/8;
int tempR,tempG,tempB;
//float temp,tempX,tempY;
int temp;
float u0,u1; //均值
float w0,w1; //概率
float sum0,sum1; //像素和
int optIndex,optT; //最优阈值,及其所在像素的值
float fVaria,fMaxVaria=0; //临时方差,最大方差

//int pixelR[256],pixelG[256],pixelB[256];
int pixel[256]={0}; //不要忘记初始化
//灰度化
for (int y=0; y<maxY; y++) {
for (int x=0; x<maxX; 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);
}
*(pRealData3+pit3*(y)+(x)*bitCount3)=temp;
*(pRealData3+pit3*(y)+(x)*bitCount3+1)=temp;
*(pRealData3+pit3*(y)+(x)*bitCount3+2)=temp;

}
}
//二值化
//for (int y=0; y<maxY; y++) {
//for (int x=0; x<maxX; x++) {
//temp=*(pRealData3+pit3*(y)+(x)*bitCount3);
//if(temp>128)
//temp=255;
//else
//temp=0;
//*(pRealData3+pit3*(y)+(x)*bitCount3)=temp;
//*(pRealData3+pit3*(y)+(x)*bitCount3+1)=temp;
//*(pRealData3+pit3*(y)+(x)*bitCount3+2)=temp;

//}
//}
//计算开始
//取得点取点的值
int Tpoint=*(pRealData+pit*(point.y)+(point.x)*bitCount);
int Td;
if(TFlag)
{
Td=myT;
TFlag=FALSE;
}
else
Td=10;
//CString str;
//str.Format(TEXT("%d"),Td);
//AfxMessageBox(str);
for (int y=0; y<maxY; y++) {
for (int x=0; x<maxX; x++) {
temp=*(pRealData3+pit3*(y)+(x)*bitCount3);
if(temp-Tpoint>Td)
temp=255;
else
temp=0;
*(pRealData2+pit2*(y)+(x)*bitCount2)=temp;
*(pRealData2+pit2*(y)+(x)*bitCount2+1)=temp;
*(pRealData2+pit2*(y)+(x)*bitCount2+2)=temp;

}
}
Invalidate();

}

void CISLSView::OnRegionGrowDemo()
{
if(myImage1.IsNull())
OnOpenResourceFile();
AfxMessageBox(TEXT("请在源图像内单击初始点"));
flag=TRUE;
}


void CISLSView::OnRegionGrowCustome()
{
if(myImage1.IsNull())
OnOpenResourceFile();
CMyThreshlod myDlg;
if(myDlg.DoModal () == IDOK)
myT=myDlg.myT;
else
myT=0;
//CString str;
//str.Format(TEXT("%d"),myT);
//AfxMessageBox(str);
TFlag=TRUE;
AfxMessageBox(TEXT("请在源图像内单击初始点"));
flag=TRUE;
}