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

📄 edge.c

📁 这是我珍藏的图像处理入门C源码分析,给大家共享了!
💻 C
📖 第 1 页 / 共 3 页
字号:
				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;

		}



	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;

}

////////////////////////////////////////////////////////////////

BOOL Contour(HWND hWnd)

{

	DWORD              OffBits,BufSize;

    LPBITMAPINFOHEADER lpImgData;

	LPSTR              lpPtr;

	HLOCAL             hTempImgData;

	LPBITMAPINFOHEADER lpTempImgData;

	LPSTR              lpTempPtr;

	HDC                hDc;

	HFILE              hf;

	LONG               x,y;

	POINT              StartP,CurP;

	BOOL               found;

	int                i;

	int                direct[8][2]={{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1}};



	if( NumColors!=256){

    	MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!","Error Message",MB_OK|MB_ICONEXCLAMATION);

        return FALSE;

    }



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

	memset(lpTempImgData,(BYTE)255,BufSize);

	memcpy(lpTempImgData,lpImgData,OffBits);



	found=FALSE;

	for (y=0;y<bi.biHeight && !found; y++){

		lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);

		for (x=0;x<bi.biWidth && !found; x++)

			if (*(lpPtr++) ==0) found=TRUE;

	}



	if(found){

		StartP.x=x-1;

		StartP.y=y-1;

		lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-StartP.y*LineBytes)+StartP.x;

		*lpTempPtr=(unsigned char)0;

   		CurP.x=StartP.x+1;

		CurP.y=StartP.y;

		lpPtr=(char *)lpImgData+(BufSize-LineBytes-CurP.y*LineBytes)+CurP.x;

		if(*lpPtr!=0){

	   		CurP.x=StartP.x+1;

			CurP.y=StartP.y+1;

			lpPtr=(char *)lpImgData+(BufSize-LineBytes-CurP.y*LineBytes)+CurP.x;

			if(*lpPtr!=0){

	   			CurP.x=StartP.x;

				CurP.y=StartP.y+1;

			}

			else{

	   			CurP.x=StartP.x-1;

				CurP.y=StartP.y+1;

			}

		}

		while (! ( (CurP.x==StartP.x) &&(CurP.y==StartP.y))){

			lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-CurP.y*LineBytes)+CurP.x;

			*lpTempPtr=(unsigned char)0;

			for(i=0;i<8;i++){

				x=CurP.x+direct[i][0];

				y=CurP.y+direct[i][1];

				lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes)+x;

				lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+x;

				if( ( (*lpPtr==0)&&(*lpTempPtr!=0) ) || ( (x==StartP.x) &&(y==StartP.y)))

					if(IsContourP(x,y,lpPtr)){

				   		CurP.x=x;

						CurP.y=y;

						break;

					}

			}

		}

	}



    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:\\contour.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 IsContourP(LONG x,LONG y, char *lpPtr)

{

	int     num,n,w,e,s;



	n=(unsigned char)*(lpPtr+LineBytes);

	w=(unsigned char)*(lpPtr-1);

	e=(unsigned char)*(lpPtr+1);

	s=(unsigned char)*(lpPtr-LineBytes);

	num=n+w+e+s;

	if(num==0)

		return FALSE;



	return TRUE;

}

////////////////////////////////////////////////////////////////

BOOL SeedFill(HWND hWnd)

{

	DWORD              BufSize;

    LPBITMAPINFOHEADER lpImgData;

	HLOCAL             hTempImgData;

	LPBITMAPINFOHEADER lpTempImgData;

	LPSTR              lpTempPtr,lpTempPtr1;

	HDC                hDc;

	HFILE              hf;

	POINT              CurP,NeighborP;



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



	if(!InitStack(hWnd,(LONG)bi.biHeight*bi.biWidth)){

		LocalUnlock(hTempImgData);

		LocalFree(hTempImgData);

		GlobalUnlock(hImgData);

		return FALSE;

	}



	lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-SeedPoint.y*LineBytes)+SeedPoint.x;

	if(*lpTempPtr==0){

    	MessageBox(hWnd,"The point you select is a contour point!","Error Message",MB_OK|MB_ICONEXCLAMATION);

		LocalUnlock(hTempImgData);

		LocalFree(hTempImgData);

		GlobalUnlock(hImgData);

		DeInitStack();

        return FALSE;

	}



	MyPush(SeedPoint);

	while(!IsStackEmpty())

	{

		CurP=MyPop();

		lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-CurP.y*LineBytes)+CurP.x;

		*lpTempPtr=(unsigned char)0;

		//left neighbour

		if(CurP.x>0)

		{

			NeighborP.x=CurP.x-1;

			NeighborP.y=CurP.y;

			lpTempPtr1=lpTempPtr-1;

			if(*lpTempPtr1!=0)

				MyPush(NeighborP);

		}

		//up neighbour

		if(CurP.y>0)

		{

			NeighborP.x=CurP.x;

			NeighborP.y=CurP.y-1;

			lpTempPtr1=lpTempPtr+LineBytes;

			if(*lpTempPtr1!=0)

				MyPush(NeighborP);

		}

		//right neighbour

		if(CurP.x<bi.biWidth-1)

		{

			NeighborP.x=CurP.x+1;

			NeighborP.y=CurP.y;

			lpTempPtr1=lpTempPtr+1;

			if(*lpTempPtr1!=0)

				MyPush(NeighborP);

		}

		//down neighbour

		if(CurP.y<bi.biHeight-1)

		{

			NeighborP.x=CurP.x;

			NeighborP.y=CurP.y+1;

			lpTempPtr1=lpTempPtr-LineBytes;

			if(*lpTempPtr1!=0)

				MyPush(NeighborP);

		}

	}

	DeInitStack();



    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:\\seed.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 InitStack(HWND hWnd,LONG StackLen)

{

	SeedFillStack.ElementsNum=StackLen;

	if((SeedFillStack.hMem=GlobalAlloc(GHND,SeedFillStack.ElementsNum*sizeof(POINT)))==NULL)

	{

    	MessageBox(hWnd,"Error alloc memory!","ErrorMessage",MB_OK|

                   MB_ICONEXCLAMATION);

		return FALSE;

	}

	SeedFillStack.lpMyStack=(POINT *)GlobalLock(SeedFillStack.hMem);

	memset(SeedFillStack.lpMyStack,0,SeedFillStack.ElementsNum*sizeof(POINT));

	SeedFillStack.ptr=0;

	return TRUE;

}

////////////////////////////////////////////////////////////////

void DeInitStack()

{

	GlobalUnlock(SeedFillStack.hMem);

	GlobalFree(SeedFillStack.hMem);

	SeedFillStack.ElementsNum=0;

	SeedFillStack.ptr=0;

}

////////////////////////////////////////////////////////////////

BOOL MyPush(POINT p)

{

	POINT *TempPtr;

	if(SeedFillStack.ptr>=SeedFillStack.ElementsNum)

		return FALSE;

	TempPtr=(POINT *)(SeedFillStack.lpMyStack+SeedFillStack.ptr++);

	(*TempPtr).x=p.x;

	(*TempPtr).y=p.y;

	return TRUE;

}

////////////////////////////////////////////////////////////////

POINT MyPop()

{

	POINT InvalidP;

	InvalidP.x=-1;

	InvalidP.y=-1;



	if(SeedFillStack.ptr<=0)

		return InvalidP;

	SeedFillStack.ptr--;

	return *(SeedFillStack.lpMyStack+SeedFillStack.ptr);

}

////////////////////////////////////////////////////////////////

BOOL IsStackEmpty()

{

	return (SeedFillStack.ptr==0)?TRUE:FALSE;

}

⌨️ 快捷键说明

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