www.pudn.com > isee_code01231.zip > EdgeEnhance.cpp


#include "stdafx.h" 
#include "EdgeEnhance.h" 
#include "Convolute.h" 
#include "ConvoluteKernel.h" 
#include "math.h" 
 
#define MAX( a, b ) ( a > b ? a : b ) 
 
BOOL _fnCOM_Convolute(LPIMAGEPROCSTR lpInfo,int nKernel,int nStrength,KERNEL* kernel) 
{ 
//	CopyMemory(lpInfo->_pdbdata ,lpInfo->_psbdata ,lpInfo->sImageInfo.width*lpInfo->sImageInfo.height*(lpInfo->sImageInfo.bitperpix/8)); 
	WORD skip=lpInfo->sImageInfo .byteperline ; 
 
	UINT i,j; 
	for(i=1;i<(UINT)lpInfo->sImageInfo.height-1;i++) 
	{ 
		for(j=1;j<(UINT)lpInfo->sImageInfo.width-1;j++) 
		{ 
			int red=0,green=0,blue=0;	 
			for(int k=0;k_psbdata,kernel+k); 
 
				if(r>red) 
					red=r; 
				if(g>green) 
					green=g; 
				if(b>blue) 
					blue=b; 
			} 
			LONG lOffset=(LONG)(i*skip)+(LONG)(j*4); 
			if(nStrength!=100) 
			{ 
				BYTE Oldb=*(lpInfo->_psbdata+lOffset++); 
				BYTE Oldg=*(lpInfo->_psbdata+lOffset++); 
				BYTE Oldr=*(lpInfo->_psbdata+lOffset); 
				red=Oldr+(((red-Oldr)*nStrength)/100); 
				green=Oldg+(((green-Oldg)*nStrength)/100); 
				blue=Oldb+(((blue-Oldb)*nStrength)/100); 
				lOffset=(LONG)(i*skip)+(LONG)(j*4); 
			} 
			*(lpInfo->_pdbdata+lOffset++)=(BYTE)((blue)<(0)?(0):((blue)>(255)?(255):(blue))); 
			*(lpInfo->_pdbdata+lOffset++)=(BYTE)((green)<(0)?(0):((green)>(255)?(255):(green))); 
			*(lpInfo->_pdbdata+lOffset)=(BYTE)((red)<(0)?(0):((red)>(255)?(255):(red))); 
		} 
	} 
 
	return PROCERR_SUCCESS; 
} 
 
BOOL _fnCOM_Edge(LPIMAGEPROCSTR lpInfo,int nStrength,BOOL Algorith) 
{ 
//	CopyMemory(lpInfo->_pdbdata ,lpInfo->_psbdata ,lpInfo->sImageInfo.width*lpInfo->sImageInfo.height*(lpInfo->sImageInfo.bitperpix/8)); 
	WORD skip=lpInfo->sImageInfo .byteperline ; 
 
	UINT i,j; 
	for(i=1;i<(UINT)lpInfo->sImageInfo.height-1;i++) 
	{ 
		for(j=1;j<(UINT)lpInfo->sImageInfo.width-1;j++) 
		{ 
			int red=0,green=0,blue=0;	 
			_fnSPE_Edge(&red,&green,&blue,i,j,skip,lpInfo->_psbdata,nStrength,Algorith); 
		 
			LONG lOffset=(LONG)(i*skip)+(LONG)(j*4); 
			*(lpInfo->_pdbdata+lOffset++)=(BYTE)((blue)<(0)?(0):((blue)>(255)?(255):(blue))); 
			*(lpInfo->_pdbdata+lOffset++)=(BYTE)((green)<(0)?(0):((green)>(255)?(255):(green))); 
			*(lpInfo->_pdbdata+lOffset)=(BYTE)((red)<(0)?(0):((red)>(255)?(255):(red))); 
		} 
	} 
 
	return PROCERR_SUCCESS; 
} 
 
void _fnSPE_Edge(int *red,int *green,int *blue,int i,int j, 
				WORD wBytesPerLine,LPBYTE lpData, 
				int nStrength,BOOL bAlgorithm) 
{ 
	BYTE b[9],g[9],r[9]; 
	LONG lOffset; 
 
	DWORD dwLineAEIAveBelow, dwLineAEIAveAbove, dwLineAEIMaxDif; 
	DWORD dwLineBEHAveBelow, dwLineBEHAveAbove, dwLineBEHMaxDif; 
	DWORD dwLineCEGAveBelow, dwLineCEGAveAbove, dwLineCEGMaxDif; 
	DWORD dwLineDEFAveBelow, dwLineDEFAveAbove, dwLineDEFMaxDif; 
	DWORD dwMaxDif; 
	DWORD  dwTemp, dwGrayList[9]; 
 
	lOffset=(LONG)(i-1)*(LONG)wBytesPerLine+(LONG)((j-1)*4); 
	b[0]=*(lpData+lOffset++); 
	g[0]=*(lpData+lOffset++); 
	r[0]=*(lpData+lOffset); 
 
	lOffset=(LONG)(i-1)*(LONG)wBytesPerLine+(LONG)((j)*4); 
	b[1]=*(lpData+lOffset++); 
	g[1]=*(lpData+lOffset++); 
	r[1]=*(lpData+lOffset); 
 
	lOffset=(LONG)(i-1)*(LONG)wBytesPerLine+(LONG)((j+1)*4); 
	b[2]=*(lpData+lOffset++); 
	g[2]=*(lpData+lOffset++); 
	r[2]=*(lpData+lOffset); 
 
	lOffset=(LONG)(i)*(LONG)wBytesPerLine+(LONG)((j-1)*4); 
	b[3]=*(lpData+lOffset++); 
	g[3]=*(lpData+lOffset++); 
	r[3]=*(lpData+lOffset); 
 
	lOffset=(LONG)(i)*(LONG)wBytesPerLine+(LONG)((j)*4); 
	b[4]=*(lpData+lOffset++); 
	g[4]=*(lpData+lOffset++); 
	r[4]=*(lpData+lOffset); 
 
	lOffset=(LONG)(i)*(LONG)wBytesPerLine+(LONG)((j+1)*4); 
	b[5]=*(lpData+lOffset++); 
	g[5]=*(lpData+lOffset++); 
	r[5]=*(lpData+lOffset); 
 
	lOffset=(LONG)(i+1)*(LONG)wBytesPerLine+(LONG)((j-1)*4); 
	b[6]=*(lpData+lOffset++); 
	g[6]=*(lpData+lOffset++); 
	r[6]=*(lpData+lOffset); 
 
	lOffset=(LONG)(i+1)*(LONG)wBytesPerLine+(LONG)((j)*4); 
	b[7]=*(lpData+lOffset++); 
	g[7]=*(lpData+lOffset++); 
	r[7]=*(lpData+lOffset); 
 
	lOffset=(LONG)(i+1)*(LONG)wBytesPerLine+(LONG)((j+1)*4); 
	b[8]=*(lpData+lOffset++); 
	g[8]=*(lpData+lOffset++); 
	r[8]=*(lpData+lOffset); 
 
	for(int k=0;k<9;k++) 
	{ 
		dwGrayList[k]=(r[k]*30+g[k]*59+b[k]*11)/100; 
	} 
 
	dwLineAEIAveBelow = ( dwGrayList[3] + dwGrayList[6] + dwGrayList[7] ) / 3; 
	dwLineAEIAveAbove = ( dwGrayList[1] + dwGrayList[2] + dwGrayList[5] ) / 3; 
	if( dwLineAEIAveBelow > dwLineAEIAveAbove ) 
		dwLineAEIMaxDif = dwLineAEIAveBelow - dwLineAEIAveAbove; 
	else  
		dwLineAEIMaxDif = dwLineAEIAveAbove - dwLineAEIAveBelow; 
 
	dwLineBEHAveBelow = ( dwGrayList[0] + dwGrayList[3] + dwGrayList[6] ) / 3; 
	dwLineBEHAveAbove = ( dwGrayList[2] + dwGrayList[5] + dwGrayList[8] ) / 3; 
	if( dwLineBEHAveBelow > dwLineBEHAveAbove ) 
		dwLineBEHMaxDif = dwLineBEHAveBelow - dwLineBEHAveAbove; 
	else 
		dwLineBEHMaxDif = dwLineBEHAveAbove - dwLineBEHAveBelow; 
 
	dwLineCEGAveBelow = ( dwGrayList[5] + dwGrayList[7] + dwGrayList[8] ) / 3; 
	dwLineCEGAveAbove = ( dwGrayList[0] + dwGrayList[1] + dwGrayList[3] ) / 3; 
	if( dwLineCEGAveBelow > dwLineCEGAveAbove )  
		dwLineCEGMaxDif = dwLineCEGAveBelow - dwLineCEGAveAbove; 
	else  
		dwLineCEGMaxDif = dwLineCEGAveAbove - dwLineCEGAveBelow; 
 
	dwLineDEFAveBelow = ( dwGrayList[6] + dwGrayList[7] + dwGrayList[8] ) / 3; 
	dwLineDEFAveAbove = ( dwGrayList[0] + dwGrayList[1] + dwGrayList[2] ) / 3; 
	if( dwLineDEFAveBelow > dwLineDEFAveAbove ) 
		dwLineDEFMaxDif = dwLineDEFAveBelow - dwLineDEFAveAbove; 
	else  
		dwLineDEFMaxDif = dwLineDEFAveAbove - dwLineDEFAveBelow; 
 
	dwMaxDif = MAX( dwLineAEIMaxDif, dwLineBEHMaxDif ); 
	dwMaxDif = MAX( dwLineCEGMaxDif, dwMaxDif ); 
	dwMaxDif = MAX( dwLineDEFMaxDif, dwMaxDif ); 
 
	lOffset=(LONG)(i)*(LONG)wBytesPerLine+(LONG)((j)*4); 
	if(bAlgorithm==TRUE) 
	{ 
		if( dwMaxDif >(UINT)nStrength ) 
		{ 
			dwTemp = ( ( *(lpData+lOffset++) * 15) / 10 ); 
			if( dwTemp > 255 ) 
				dwTemp = 255; 
			*blue = (unsigned char) dwTemp; 
			dwTemp = ( ( *(lpData+lOffset++) * 15) / 10 ); 
			if( dwTemp > 255 )  
				dwTemp = 255; 
			*green = (unsigned char) dwTemp; 
			dwTemp = ( ( *(lpData+lOffset) * 15) / 10 ); 
			if( dwTemp > 255 )  
				dwTemp = 255; 
			*red = (unsigned char) dwTemp; 
		} 
		else 
		{ 
			*blue = *(lpData+lOffset++); 
			*green = *(lpData+lOffset++); 
			*red = *(lpData+lOffset); 
		} 
	} 
	else 
	{ 
		if( dwMaxDif >(UINT)nStrength ) 
		{ 
			dwTemp =0; 
			if( dwTemp > 255 ) 
				dwTemp = 255; 
			*blue = (unsigned char) dwTemp; 
			dwTemp = 0; 
			if( dwTemp > 255 )  
				dwTemp = 255; 
			*green = (unsigned char) dwTemp; 
			dwTemp = 0; 
			if( dwTemp > 255 )  
				dwTemp = 255; 
			*red = (unsigned char) dwTemp; 
		} 
		else 
		{ 
			*blue = 255; 
			*green = 255; 
			*red = 255; 
		} 
	} 
}