投影法是根据图像信息在某方向的投影分布特点来进行检测的方法,也就是说像素点的累加,其实是一种统计的方法。像素灰度值为f(x,y)时,其投影函数h(y)的值为如下公式来计算:其中M,N为图像尺寸,c为图像灰度值。将投影值进行归一化,其计算公式如下:资料1中,先求投影值,再给投影值进行归一化处理。资料2中先进行二值化,然后进行灰度投影。资料1中,进行投影以后***********************************************************//HprojectDIB()//图像水平投影//VprojectDIB()//图像垂直投影参数:LPSTRlpDIBBits//指向源DIB图像指针LONGlWidth//源图像宽度(像素数)LONGlHeight-源图像高度(像素数)返回值:BOOL//运算成功返回TRUE,否则返回FALSE。*要求目标图像为只有0和255两个灰度值的灰度图像。***********************************************************BOOLWINAPIHprojectDIB(LPSTRlpDIBBits,LONGlWidth,LONGlHeight){LPSTRlpSrc;//指向源图像的指针LPSTRlpDst;//指向缓存图像的指针LPSTRlpNewDIBBits;//指向缓存DIB图像的指针HLOCALhNewDIBBits;longi;//循环变量longj;longlBlackNumber;//图像中每行内的黑点个数unsignedcharpixel;//像素值LONGlLineBytes;//图像每行的字节数函数的声明定义变量hNewDIBBits=LocalAlloc(LHND,lWidth*lHeight);//暂时分配内存,以保存新图像if(hNewDIBBits==NULL){returnFALSE;//分配内存失败}lpNewDIBBits=(char*)LocalLock(hNewDIBBits);//初始化新分配的内存,设定初始值为255lpDst=(char*)lpNewDIBBits;memset(lpDst,(BYTE)255,lWidth*lHeight);暂时分配内存如果成功分配内存,则初始化新内存lLineBytes=WIDTHBYTES(lWidth*8);//计算图像每行的字节数for(j=0;jlHeight;j++){lBlackNumber=0;for(i=0;ilWidth;i++){lpSrc=(char*)lpDIBBits+lLineBytes*j+i;//指向源图像倒数第j行,第i个象素的指针pixel=(unsignedchar)*lpSrc;if(pixel!=255&&pixel!=0){returnfalse;}if(pixel==0){lBlackNumber++;}}if(pixel==0){lBlackNumber++;}}计算像素值和for(i=0;ilBlackNumber;i++){//指向目标图像倒数第j行,第i个象素的指针lpDst=(char*)lpNewDIBBits+lLineBytes*j+i;*lpDst=(unsignedchar)0;}}//复制投影图像memcpy(lpDIBBits,lpNewDIBBits,lWidth*lHeight);LocalUnlock(hNewDIBBits);//释放内存LocalFree(hNewDIBBits);returnTRUE;//返回}形成新图像(投影后的图像)复制投影图像释放内存返回函数值BOOLWINAPIVprojectDIB(LPSTRlpDIBBits,LONGlWidth,LONGlHeight){LPSTRlpSrc;//指向源图像的指针LPSTRlpDst;//指向缓存图像的指针LPSTRlpNewDIBBits;//指向缓存DIB图像的指针HLOCALhNewDIBBits;longi;longj;longlBlackNumber;//图像中每行内的黑点个数unsignedcharpixel;//像素值LONGlLineBytes;//图像每行的字节数hNewDIBBits=LocalAlloc(LHND,lWidth*lHeight);//暂时分配内存,以保存新图像if(hNewDIBBits==NULL){returnFALSE;//分配内存失败}lpNewDIBBits=(char*)LocalLock(hNewDIBBits);//锁定内存lpDst=(char*)lpNewDIBBits;//初始化新分配的内存,设定初始值为255memset(lpDst,(BYTE)255,lWidth*lHeight);lLineBytes=WIDTHBYTES(lWidth*8);//计算图像每行的字节数for(i=0;ilWidth;i++){lBlackNumber=0;for(j=0;jlHeight;j++){lpSrc=(char*)lpDIBBits+lLineBytes*j+i;//指向源图像倒数第j行,第i个象素的指针pixel=(unsignedchar)*lpSrc;if(pixel!=255&&pixel!=0){returnfalse;}if(pixel==0){lBlackNumber++;}}for(j=0;jlBlackNumber;j++){//指向目标图像倒数第j行,第i个象素的指针lpDst=(char*)lpNewDIBBits+lLineBytes*j+i;*lpDst=(unsignedchar)0;}}//复制投影图像memcpy(lpDIBBits,lpNewDIBBits,lWidth*lHeight);//释放内存LocalUnlock(hNewDIBBits);LocalFree(hNewDIBBits);//返回returnTRUE;}