区域增长法(vc实现)

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


  1.     void CISLSView::OnLButtonDown(UINT nFlags, CPoint point)  
  2.     {  
  3. //程序编制:李立宗  lilizong@gmail.com  
  4. //2012-8-14   
  5.         if(flag)  
  6.         {  
  7.             flag = FALSE;  
  8.             CISLSDoc *pDoc = GetDocument();  
  9.             regionGrow(point);  
  10.         }  
  11.         //CView::OnLButtonDown(nFlags, point);  
  12.     }  
  13.   
  14.   
  15.     // 区域增长   
  16.     void CISLSView::regionGrow(CPoint point)  
  17.     {  
  18.         if(myImage1.IsNull())  
  19.             OnOpenResourceFile();  
  20.         if(!myImage2.IsNull())  
  21.             myImage2.Destroy();  
  22.         if(myImage2.IsNull()){  
  23.             myImage2.Create(myImage1.GetWidth(),myImage1.GetHeight(),24,0);  
  24.         }  
  25.         if(myImage3.IsNull()){  
  26.             myImage3.Create(myImage1.GetWidth(),myImage1.GetHeight(),24,0);  
  27.         }  
  28.         //COLORREF pixel;    
  29.         int maxY = myImage1.GetHeight();  
  30.         int maxX=myImage1.GetWidth();  
  31.         byte* pRealData;  
  32.         byte* pRealData2;  
  33.         byte* pRealData3;  
  34.         pRealData=(byte*)myImage1.GetBits();  
  35.         pRealData2=(byte*)myImage2.GetBits();  
  36.         pRealData3=(byte*)myImage3.GetBits();  
  37.         int pit=myImage1.GetPitch();  
  38.         int pit2=myImage2.GetPitch();  
  39.         int pit3=myImage3.GetPitch();  
  40.         //需要注意,pit和pit2的值并不一样,所以如果使用一个值,会导致不同的结果出现  
  41.         //CString str;   
  42.         //str.Format(TEXT("%d"),pit);   
  43.         //MessageBox(str);   
  44.         //str.Format(TEXT("%d"),pit2);   
  45.         //MessageBox(str);   
  46.         int bitCount=myImage1.GetBPP()/8;  
  47.         int bitCount2=myImage2.GetBPP()/8;  
  48.         int bitCount3=myImage3.GetBPP()/8;  
  49.         int tempR,tempG,tempB;  
  50.         //float temp,tempX,tempY;   
  51.         int temp;  
  52.         float u0,u1;   //均值  
  53.         float w0,w1;   //概率  
  54.         float sum0,sum1;  //像素和  
  55.         int optIndex,optT;   //最优阈值,及其所在像素的值  
  56.         float fVaria,fMaxVaria=0;   //临时方差,最大方差  
  57.   
  58.         //int pixelR[256],pixelG[256],pixelB[256];  
  59.         int pixel[256]={0};   //不要忘记初始化  
  60.         //灰度化   
  61.         for (int y=0; y<maxY; y++) {  
  62.             for (int x=0; x<maxX; x++) {  
  63.                 temp=*(pRealData+pit*(y)+(x)*bitCount);  
  64.                 if(bitCount==3)  
  65.                 {  
  66.                     tempR=*(pRealData+pit*(y)+(x)*bitCount);  
  67.                     tempG=*(pRealData+pit*(y)+(x)*bitCount+1);  
  68.                     tempB=*(pRealData+pit*(y)+(x)*bitCount+2);  
  69.                     temp=(int)(tempR*0.49+tempG*0.31+tempB*0.2);  
  70.                     //temp=(int)((tempR+tempG+tempB)/3);  
  71.                 }  
  72.                 *(pRealData3+pit3*(y)+(x)*bitCount3)=temp;  
  73.                 *(pRealData3+pit3*(y)+(x)*bitCount3+1)=temp;  
  74.                 *(pRealData3+pit3*(y)+(x)*bitCount3+2)=temp;  
  75.   
  76.             }  
  77.         }  
  78.         //二值化   
  79.         //for (int y=0; y<maxY; y++) {  
  80.         //  for (int x=0; x<maxX; x++) {   
  81.         //      temp=*(pRealData3+pit3*(y)+(x)*bitCount3);  
  82.         //      if(temp>128)   
  83.         //          temp=255;   
  84.         //      else   
  85.         //          temp=0;   
  86.         //      *(pRealData3+pit3*(y)+(x)*bitCount3)=temp;  
  87.         //      *(pRealData3+pit3*(y)+(x)*bitCount3+1)=temp;  
  88.         //      *(pRealData3+pit3*(y)+(x)*bitCount3+2)=temp;  
  89.   
  90.         //  }   
  91.         //}    
  92.         //计算开始   
  93.         //取得点取点的值   
  94.         int Tpoint=*(pRealData+pit*(point.y)+(point.x)*bitCount);  
  95.         int Td;  
  96.         if(TFlag)  
  97.         {  
  98.             Td=myT;  
  99.             TFlag=FALSE;  
  100.         }  
  101.         else  
  102.             Td=10;  
  103.         //CString str;   
  104.         //str.Format(TEXT("%d"),Td);   
  105.         //AfxMessageBox(str);   
  106.         for (int y=0; y<maxY; y++) {  
  107.             for (int x=0; x<maxX; x++) {  
  108.                 temp=*(pRealData3+pit3*(y)+(x)*bitCount3);  
  109.                 if(temp-Tpoint>Td)  
  110.                     temp=255;  
  111.                 else  
  112.                     temp=0;  
  113.                 *(pRealData2+pit2*(y)+(x)*bitCount2)=temp;  
  114.                 *(pRealData2+pit2*(y)+(x)*bitCount2+1)=temp;  
  115.                 *(pRealData2+pit2*(y)+(x)*bitCount2+2)=temp;  
  116.   
  117.             }  
  118.         }  
  119.         Invalidate();  
  120.   
  121.     }  
  122.   
  123.     void CISLSView::OnRegionGrowDemo()  
  124.     {  
  125.         if(myImage1.IsNull())  
  126.             OnOpenResourceFile();  
  127.         AfxMessageBox(TEXT("请在源图像内单击初始点"));  
  128.         flag=TRUE;  
  129.     }  
  130.   
  131.   
  132.     void CISLSView::OnRegionGrowCustome()  
  133.     {  
  134.         if(myImage1.IsNull())  
  135.             OnOpenResourceFile();  
  136.         CMyThreshlod myDlg;  
  137.         if(myDlg.DoModal () == IDOK)      
  138.             myT=myDlg.myT;  
  139.         else  
  140.             myT=0;  
  141.         //CString str;   
  142.         //str.Format(TEXT("%d"),myT);   
  143.         //AfxMessageBox(str);   
  144.         TFlag=TRUE;   
  145.                 AfxMessageBox(TEXT("请在源图像内单击初始点"));  
  146.         flag=TRUE;  
  147.     }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值