通过在图像上单击,获取当前点像素,然后根据当前像素进行像素区间的选择。
- 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;
- }