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

📄 拉普拉斯高斯边缘检测.txt

📁 19Kinds_image_arithmath 19种图像基本算法
💻 TXT
字号:
//定义拉普拉斯高斯算子
float Template_Log[25]={-2.0f,-4.0f,-4.0f,-4.0f,-2.0f,
-4.0f,0.0f,8.0f,0.0f,-4.0f,
-4.0f,8.0f,24.0f,8.0f,-4.0f,
-4.0f,0.0f,8.0f,0.0f,-4.0f,
-2.0f,-4.0f,-4.0f,-4.0f,-2.0f
};
//参数说明:
//hWnd 图像处理的窗口句柄
//函数说明: 函数实现图像的拉普拉斯高斯边缘检测

BOOL LapOfGauss(HWND hWnd)
{	
	//定义偏移,内存
	DWORD              OffBits,BufSize;
	//文件信息头指针
	LPBITMAPINFOHEADER lpImgData;
	//数据区指针
	LPSTR              lpPtr;
	HLOCAL             hTempImgData;
	LPBITMAPINFOHEADER lpTempImgData;
	LPSTR              lpTempPtr;
	//定义了一个DC
	HDC                hDc;
	//文件句柄
	HFILE              hf;
	LONG               x,y;
	float              coef;
	float              TempNum;
	
	coef=(float)(1.0);
	//得到数据相对文件头的偏移
	OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
	//计算所需内存
	BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
	//分配内存
	if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)
	{
		MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;
	}
	//锁定内存区域
	lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);    
	lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);
	//指向数据区
	lpPtr=(char *)lpImgData;
	lpTempPtr=(char *)lpTempImgData;
	//数据复制
	memcpy(lpTempPtr,lpPtr,BufSize);
	//拉普拉斯高斯边缘检测
	for(y=2;y<bi.biHeight-2;y++)
		for(x=2;x<bi.biWidth-2;x++){
			//得到数据区位置
			lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+x;
			lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes)+x;
			//与算子进行加权运算
			TempNum=(float)((unsigned char)*(lpPtr+2*LineBytes-2))*Template_Log[0];
			TempNum+=(float)((unsigned char)*(lpPtr+2*LineBytes-1))*Template_Log[1];
			TempNum+=(float)((unsigned char)*(lpPtr+2*LineBytes))*Template_Log[2];
			TempNum+=(float)((unsigned char)*(lpPtr+2*LineBytes+1))*Template_Log[3];
			TempNum+=(float)((unsigned char)*(lpPtr+2*LineBytes+2))*Template_Log[4];
			TempNum+=(float)((unsigned char)*(lpPtr+LineBytes-2))*Template_Log[5];
			TempNum+=(float)((unsigned char)*(lpPtr+LineBytes-1))*Template_Log[6];
			TempNum+=(float)((unsigned char)*(lpPtr+LineBytes))*Template_Log[7];
			TempNum+=(float)((unsigned char)*(lpPtr+LineBytes+1))*Template_Log[8];
			TempNum+=(float)((unsigned char)*(lpPtr+LineBytes+2))*Template_Log[9];
			
			TempNum+=(float)((unsigned char)*(lpPtr-2))*Template_Log[10];
			TempNum+=(float)((unsigned char)*(lpPtr-1))*Template_Log[11];
			TempNum+=(float)((unsigned char)*(lpPtr))*Template_Log[12];
			TempNum+=(float)((unsigned char)*(lpPtr+1))*Template_Log[13];
			TempNum+=(float)((unsigned char)*(lpPtr+2))*Template_Log[14];
			TempNum+=(float)((unsigned char)*(lpPtr-LineBytes-2))*Template_Log[15];
			TempNum+=(float)((unsigned char)*(lpPtr-LineBytes-1))*Template_Log[16];
			TempNum+=(float)((unsigned char)*(lpPtr-LineBytes))*Template_Log[17];
			TempNum+=(float)((unsigned char)*(lpPtr-LineBytes+1))*Template_Log[18];
			TempNum+=(float)((unsigned char)*(lpPtr-LineBytes+2))*Template_Log[19];
			TempNum+=(float)((unsigned char)*(lpPtr-2*LineBytes-2))*Template_Log[20];
			TempNum+=(float)((unsigned char)*(lpPtr-2*LineBytes-1))*Template_Log[21];
			TempNum+=(float)((unsigned char)*(lpPtr-2*LineBytes))*Template_Log[22];
			TempNum+=(float)((unsigned char)*(lpPtr-2*LineBytes+1))*Template_Log[23];
			TempNum+=(float)((unsigned char)*(lpPtr-2*LineBytes+2))*Template_Log[24];
			//乘上系数
			TempNum*=coef;
			//临界判断
			if(TempNum>255.0) *lpTempPtr=(BYTE)255;
			else if(TempNum<0.0) 
				*lpTempPtr=(unsigned char)fabs(TempNum);
			else *lpTempPtr=(BYTE)TempNum;
		}
		//得到窗口的DC
		hDc=GetDC(hWnd);
		if(hBitmap!=NULL)
			DeleteObject(hBitmap);
		//创建位图
		hBitmap=CreateDIBitmap(hDc,	(LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,
			(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
			(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);
		//保存位图
		hf=_lcreat("c:\\log.bmp",0);
		_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); 
		_lwrite(hf,(LPSTR)lpTempImgData,BufSize);
		_lclose(hf);
		//释放资源
		ReleaseDC(hWnd,hDc);
		LocalUnlock(hTempImgData);
		LocalFree(hTempImgData);
		GlobalUnlock(hImgData);
		return TRUE;
}

⌨️ 快捷键说明

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