wbc特徵提取

/* CvBox2D skin_rect;
 CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* contour = 0;
 CvMemStorage* storage2 = cvCreateMemStorage(0);
    CvSeq* contour2 = 0;
 cvFindContours( fore, storage, &contour, sizeof(CvContour),CV_RETR_LIST, CV_CHAIN_APPROX_NONE, cvPoint(0,0));
 CvSeq* contour_max=0;
 for( ; contour != 0; contour = contour->h_next )
 {
    int tmparea=abs(cvContourArea(contour,CV_WHOLE_SEQ));//輪廓區域的面積
  if (tmparea<14)//大量數據得到-----------同時整個區域的樣本數量爲0   樣本可以分到雜質
  {
   cvSeqRemove(contour,0);
   continue;
  }
  num_connect++; 
  double tmpcount=cvArcLength(contour,CV_WHOLE_SEQ,-1);
  
   skin_rect = cvMinAreaRect2(contour, 0);//最小外界矩形 
     float tmpbox=(float)skin_rect.size.height/skin_rect.size.width;//長寬比
  //h_axis=skin_rect.size.height;
  //w_axis=skin_rect.size.width;
  if(tmparea > maxarea)
  {
   maxarea = tmparea;//最大面積連通區域
   contour_max=cvCloneSeq(contour);
  }
  if(tmpcount > count)
  {
   count = tmpcount;//最大輪廓的像素數
  }
  if(tmpbox > axisratio)
  {
   axisratio = tmpbox;//最大長短軸的比值
  }
    }
 if (contour_max!=0)
 {
  
 CvScalar color = CV_RGB( rand()&255, 0, 0 );
    cvDrawContours(dst, contour_max, color, color, -1, -1, 8);
 ConcavityRepair(dst,3);//對fore圖像進行修補
 cvFindContours( dst, storage2, &contour2, sizeof(CvContour),CV_RETR_LIST, CV_CHAIN_APPROX_NONE, cvPoint(0,0));

    cvDrawContours(src, contour2, color, color, -1, 1, 8);/*
  /************************************************************************/
  /*                            圖像輪廓的HU矩                            */
  /************************************************************************/
/*
   CvMoments m;
   CvHuMoments hu;
   //cvMoments(cvGetSubRect(fore,&mat,rct),&m,0);
   cvMoments(contour2,&m,0);
   cvGetHuMoments(&m,&hu);
   huju[0]=(float)fabs(log10(fabs(hu.hu1)));
   huju[1]=(float)fabs(log10(fabs(hu.hu2)));
   huju[2]=(float)fabs(log10(fabs(hu.hu3)));
   huju[3]=(float)fabs(log10(fabs(hu.hu4)));
   huju[4]=(float)fabs(log10(fabs(hu.hu5)));
   huju[5]=(float)fabs(log10(fabs(hu.hu6)));
   huju[6]=(float)fabs(log10(fabs(hu.hu7)));*/
     /************************************************************************/
  /*                            圖像重心及半徑分佈                        */
  /************************************************************************/
  
 /*  double m00,x,y;
   double r_long=0;
   double r_short=100;
   int num_long,num_short;//長、短軸對應的弧度
  float dist_sum=0;//距離和
  m00=cvGetSpatialMoment(&m,0,0);
  x=cvGetSpatialMoment(&m,1,0)/m00;  //重心座標
  y=cvGetSpatialMoment(&m,0,1)/m00;
  int contour_max_count=contour2->total;   //this is number point in contour
  CvPoint* pointarray;
  float* dist_center=new float[contour_max_count];
  pointarray=(CvPoint*)malloc(contour_max_count*sizeof(CvPoint));
  cvCvtSeqToArray(contour2,pointarray,CV_WHOLE_SEQ);
  //查找最長和最短軸
  for (i=0;i<contour_max_count;i++)
  {
   dist_center[i]=sqrt(((float)pointarray[i].x-x)*((float)pointarray[i].x-x)+((float)pointarray[i].y-y)*((float)pointarray[i].y-y));
  //fprintf(stream,"%f ",dist_center[i]);
   dist_sum+=dist_center[i];
   if (r_long<dist_center[i])
   {
    r_long=dist_center[i];
    num_long=i;
   }
   if (r_short>dist_center[i])
   {
    r_short=dist_center[i];
    num_short=i;
   }
  }
  axisratio=r_long/r_short;//計算長短軸的比值
  axis_angle=(float)abs(num_long-num_short)/contour_max_count;//計算長短軸對應的角度
  dist_avar=dist_sum/contour_max_count;//均值
  float vari_temp=0;
  for (i=0;i<contour_max_count;i++)
  {
   vari_temp+=(dist_center[i]-dist_vari)*(dist_center[i]-dist_vari);
  }
  dist_vari=sqrt(vari_temp/contour_max_count);
  free(pointarray);
  delete[] dist_center;*/
 /************************************************************************/
 /*                         細胞核灰度均值、方差、圖像熵                 */
 /*注意:找輪廓的時候已經刪除了一部分小面積的區域,這部分是否參與計算    */
 /************************************************************************/
/* int sum_gray=0;//灰度和
 int sum_pix=0;//像素和
 float ffreq[256]={0};
 for (i=0;i<dst->height;i++)
 {
  for (int j=0;j<dst->width;j++)
  {
   if (((uchar*)(dst->imageData+i*dst->widthStep))[j]==255)
   {
    sum_pix++;
    int temp=((uchar*)(src->imageData+i*src->widthStep))[j];
    sum_gray+=temp;
    ffreq[temp]++;
   }
  }
 }
 for (i=0;i<256;i++)
 {
  ffreq[i]/=(float)sum_pix;
 }
  // 計算圖像熵
 for (i = 0; i < 256; i ++)
 {
  // 判斷概率是否大於0
  if (ffreq[i] > 0)
  {
   // 計算圖像熵
   shan_maxcontour -= ffreq[i] * log(ffreq[i]) / log(2.0);
  }
 }
 averagegray=(double)sum_gray/sum_pix;//均值
 int grey_s=0;
 for (i=0;i<dst->height;i++)
 {
  for (int j=0;j<dst->width;j++)
  {
   if (((uchar*)(dst->imageData+i*dst->widthStep))[j]==255)
   {
    
    grey_s+=(((uchar*)(src->imageData+i*src->widthStep))[j]-averagegray)*(((uchar*)(src->imageData+i*src->widthStep))[j]-averagegray);
   }
  }
 }
 variance_gray=sqrt(grey_s/(sum_pix+eps)); //方差
  

 }
 else
 {
  return 0;
 }

 CString aa(Path);
 aa+="-1.jpg";//保存圖像爲新的路徑,但不影響原先的bmp圖像
 cvSaveImage(aa,src);
 cvReleaseMemStorage(&storage2);
 cvReleaseMemStorage(&storage);*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章