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

📄 edge.c

📁 边缘检测源代码.rar
💻 C
📖 第 1 页 / 共 3 页
字号:
		hPalette=CreatePalette(pPal);
		LocalUnlock(hPal);
		LocalFree(hPal);
	}
	hDc=GetDC(hWnd);
	if(hPalette){
        hPrevPalette=SelectPalette(hDc,hPalette,FALSE);
		RealizePalette(hDc);
	}
	hBitmap=CreateDIBitmap(hDc,	(LPBITMAPINFOHEADER)lpImgData, (LONG)CBM_INIT,
				(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
   				(LPBITMAPINFO)lpImgData, DIB_RGB_COLORS);
	if(hPalette && hPrevPalette){
		SelectPalette(hDc,hPrevPalette,FALSE);
		RealizePalette(hDc);
	}
 
	ReleaseDC(hWnd,hDc);
	GlobalUnlock(hImgData);
	return TRUE; 
}
////////////////////////////////////////////////////////////////
BOOL TemplateOperation(HWND hWnd, int TemplateType)
{
	DWORD              OffBits,BufSize;
    LPBITMAPINFOHEADER lpImgData;
	LPSTR              lpPtr;
	HLOCAL             hTempImgData;
	LPBITMAPINFOHEADER lpTempImgData;
	LPSTR              lpTempPtr;
	HDC                hDc;
	HFILE              hf;
	LONG               x,y;
	float              coef;
	float              CoefArray[9];
	float              TempNum;
	char               filename[80];

	switch(TemplateType){
	case TEMPLATE_SMOOTH_BOX:
		coef=(float)(1.0/9.0);
		memcpy(CoefArray,Template_Smooth_Box,9*sizeof(float));
		strcpy(filename,"c:\\smbox.bmp");
		break;
	case TEMPLATE_SMOOTH_GAUSS:
		coef=(float)(1.0/16.0);
		memcpy(CoefArray,Template_Smooth_Gauss,9*sizeof(float));
		strcpy(filename,"c:\\smgauss.bmp");
		break;
	case TEMPLATE_SHARPEN_LAPLACIAN:
		coef=(float)1.0;
		memcpy(CoefArray,Template_Sharpen_Laplacian,9*sizeof(float));
		strcpy(filename,"c:\\shlaplac.bmp");
		break;
	case TEMPLATE_SOBEL_H:
		coef=(float)1.0;
		memcpy(CoefArray,Template_HSobel,9*sizeof(float));
		strcpy(filename,"c:\\hsobel.bmp");
		break;
	case TEMPLATE_SOBEL_V:
		coef=(float)1.0;
		memcpy(CoefArray,Template_VSobel,9*sizeof(float));
		strcpy(filename,"c:\\vsobel.bmp");
		break;
	case TEMPLATE_ISOSOBEL_H:
		coef=(float)1.0;
		memcpy(CoefArray,Template_HIsoSobel,9*sizeof(float));
		strcpy(filename,"c:\\hisobel.bmp");
		break;
	case TEMPLATE_ISOSOBEL_V:
		coef=(float)1.0;
		memcpy(CoefArray,Template_VIsoSobel,9*sizeof(float));
		strcpy(filename,"c:\\visobel.bmp");
		break;
	}

	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=1;y<bi.biHeight-1;y++)
			for(x=1;x<bi.biWidth-1;x++){
				lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+x;
				lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes)+x;
				TempNum=(float)((unsigned char)*(lpPtr+LineBytes-1))*CoefArray[0];
				TempNum+=(float)((unsigned char)*(lpPtr+LineBytes))*CoefArray[1];
				TempNum+=(float)((unsigned char)*(lpPtr+LineBytes+1))*CoefArray[2];
				TempNum+=(float)((unsigned char)*(lpPtr-1))*CoefArray[3];
				TempNum+=(float)((unsigned char)*lpPtr)*CoefArray[4];
				TempNum+=(float)((unsigned char)*(lpPtr+1))*CoefArray[5];
				TempNum+=(float)((unsigned char)*(lpPtr-LineBytes-1))*CoefArray[6];
				TempNum+=(float)((unsigned char)*(lpPtr-LineBytes))*CoefArray[7];
				TempNum+=(float)((unsigned char)*(lpPtr-LineBytes+1))*CoefArray[8];
				TempNum*=coef;
				if(TempNum>255.0) *lpTempPtr=(BYTE)255;
				else if(TempNum<0.0) 
					*lpTempPtr=(unsigned char)fabs(TempNum);
				else *lpTempPtr=(BYTE)TempNum;
		}

	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(filename,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;
}
////////////////////////////////////////////////////////////////
BOOL Outline(HWND hWnd)
{
	DWORD              BufSize;
    LPBITMAPINFOHEADER lpImgData;
	LPSTR              lpPtr;
	HLOCAL             hTempImgData;
	LPBITMAPINFOHEADER lpTempImgData;
	LPSTR              lpTempPtr;
	HDC                hDc;
	HFILE              hf;
	LONG               x,y;
	int			       num;
	int                nw,n,ne,w,e,sw,s,se;

	if( NumColors!=256){
    	MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!","Error Message",MB_OK|MB_ICONEXCLAMATION);
        return FALSE;
    }
	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);
	//copy image data
	memcpy(lpTempImgData,lpImgData,BufSize);

	for (y=1;y<bi.biHeight-1;y++){
		lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
		lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);
		for (x=1;x<bi.biWidth-1;x++){
			if(*(lpPtr+x)==0){
				nw=(unsigned char)*(lpPtr+x+LineBytes-1);
				n=(unsigned char)*(lpPtr+x+LineBytes);
				ne=(unsigned char)*(lpPtr+x+LineBytes+1);
				w=(unsigned char)*(lpPtr+x-1);
				e=(unsigned char)*(lpPtr+x+1);
				sw=(unsigned char)*(lpPtr+x-LineBytes-1);
				s=(unsigned char)*(lpPtr+x-LineBytes);
				se=(unsigned char)*(lpPtr+x-LineBytes+1);
				num=nw+n+ne+w+e+sw+s+se;
				if(num==0)
					*(lpTempPtr+x)=(unsigned char)255;
			}
		}
	}

    if(hBitmap!=NULL)
	    DeleteObject(hBitmap);
	hDc=GetDC(hWnd);	
	hBitmap=CreateDIBitmap(hDc,	(LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,
				(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
   				(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);

	hf=_lcreat("c:\\outline.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;
}
////////////////////////////////////////////////////////////////
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;

	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 ; //0 degree to 178 degree , step is 2 degrees

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

	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;
}
////////////////////////////////////////////////////////////////
BOOL LapOfGauss(HWND hWnd)
{
	DWORD              OffBits,BufSize;
    LPBITMAPINFOHEADER lpImgData;
	LPSTR              lpPtr;
	HLOCAL             hTempImgData;
	LPBITMAPINFOHEADER lpTempImgData;
	LPSTR              lpTempPtr;
	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++){

⌨️ 快捷键说明

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