工作用到的主要圖象算法

Hough變換

BOOL Hough(HWND hWnd)

 //定義直線結構
 typedef struct{
  int topx;
  int topy;
  int botx;
  int boty;
 }MYLINE;
 //內存
 DWORD              BufSize;
 //文件信息頭指針
 LPBITMAPINFOHEADER lpImgData;
 //數據區指針
 LPSTR              lpPtr;
 HDC                hDc;
 LONG               x,y;
 long               i,maxd;
 int                k;
 int                Dist,Alpha;
 //定義了一個全局句柄
 HGLOBAL            hDistAlpha,hMyLine;
 int        *lpDistAlpha;
 MYLINE             *lpMyLine,*TempLine,MaxdLine;
 //定義一個邏輯畫筆
 static LOGPEN      rlp={PS_SOLID,1,1,RGB(255,0,0)};
 
 //畫筆
 HPEN               rhp;
 //判斷是否爲256色位圖
 if( NumColors!=256){
  MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!","Error Message",MB_OK|MB_ICONEXCLAMATION);
  return FALSE;
 }
 //計算對角線長度
 Dist=(int)(sqrt( (double)bi.biWidth*bi.biWidth+(double)bi.biHeight*bi.biHeight)+0.5);
 Alpha=180 /2 ;
 //分配內存用來處理數據
 if((hDistAlpha=GlobalAlloc(GHND,(DWORD)Dist* Alpha * sizeof(int)))==NULL){
  MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);
  return FALSE;
 }
 //分配內存來存放直線數據
 if((hMyLine=GlobalAlloc(GHND,(DWORD)Dist*Alpha*sizeof(MYLINE)))==NULL){
  GlobalFree(hDistAlpha);
  return  FALSE;
 }
 //得到文件頭到數據區的偏移
 BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
 //鎖定內存
 lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
 lpDistAlpha=(int *)GlobalLock(hDistAlpha);
 lpMyLine=(MYLINE *)GlobalLock(hMyLine);
 //初始化直線數組
 for (i=0;i<(long)Dist*Alpha;i++){
  TempLine=(MYLINE*)(lpMyLine+i);
  (*TempLine).boty=32767;
 }
 //掃描整個源圖像
 for (y=0;y<bi.biHeight;y++){
  lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
  for (x=0;x<bi.biWidth;x++)
   //黑色點
   if(*(lpPtr++)==0)
    for (k=0;k<180;k+=2){
     
     //在各個方向上加上這個點出現的概率(次數)
     i=(long)fabs((x*cos(k*PI/180.0)+y*sin(k*PI/180.0)));
     *(lpDistAlpha+i*Alpha+k/2)=*(lpDistAlpha+i*Alpha+k/2)+1;
     TempLine=(MYLINE*)(lpMyLine+i*Alpha+k/2);
     //修改直線結構調整y值
     //當前的y值大於結構中已有的值
     if(y> (*TempLine).topy){
      (*TempLine).topx=x;
      (*TempLine).topy=y;
     }
     //小於
     if(y< (*TempLine).boty){
      (*TempLine).botx=x;
      (*TempLine).boty=y;
     }
    }
 }
 
 maxd=0;
 //尋找概率最大的那條直線
 for (i=0;i<(long)Dist*Alpha;i++){
  TempLine=(MYLINE*)(lpMyLine+i);
  k=*(lpDistAlpha+i);
  if( k > maxd){
   maxd=k;
   //更新概率最大直線的兩個端點位置座標
   MaxdLine.topx=(*TempLine).topx;
   MaxdLine.topy=(*TempLine).topy;
   MaxdLine.botx=(*TempLine).botx;
   MaxdLine.boty=(*TempLine).boty;
  }
 }
 //得到DC
 hDc = GetDC(hWnd);
 rhp = CreatePenIndirect(&rlp);
 SelectObject(hDc,rhp);
 //移動到起始點
 MoveToEx(hDc,MaxdLine.botx,MaxdLine.boty,NULL);
 //畫直線
 LineTo(hDc,MaxdLine.topx,MaxdLine.topy);
 DeleteObject(rhp);                      
 //釋放資源
 ReleaseDC(hWnd,hDc);
 GlobalUnlock(hImgData);
 GlobalUnlock(hDistAlpha);
 GlobalFree(hDistAlpha);
 GlobalUnlock(hMyLine);
 GlobalFree(hMyLine);
 return TRUE;
}

 

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