⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hough变换.txt

📁 数字图像处理技术源代码
💻 TXT
字号:
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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -