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

📄 edge.c

📁 这是我珍藏的图像处理入门C源码分析,给大家共享了!
💻 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 + -