工作用到的主要图象算法

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值