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

📄 edge.c

📁 边缘检测源代码.rar
💻 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 + -