投影算法及其实现C代码学习教案.pptx
会计学1投影算法投影算法(sun f)及其实现及其实现C代码代码第一页,共22页。投影投影(tuyng)概念概念n n投影法是根据图像信息在某方向的投影分布特点来进行检测的方法(fngf),也就是说像素点的累加,其实是一种统计的方法(fngf)。第1页/共22页第二页,共22页。投影算法投影算法(sun f)过程:过程:n n像素灰度值为f(x,y)时,其投影函数h(y)的值为如下公式来计算:n n其中M,N 为图像尺寸(ch cun),c 为图像灰度值。n n将投影值进行归一化,其计算公式如下:第2页/共22页第三页,共22页。n n资料1 中,先求投影值,再给投影值进行(jnxng)归一化处理。n n资料2中先进行(jnxng)二值化,然后进行(jnxng)灰度投影。第3页/共22页第四页,共22页。n n资料(zlio)1中,进行投影以后第4页/共22页第五页,共22页。求投影求投影(tuyng)面积比面积比第5页/共22页第六页,共22页。投影图面积投影图面积(min j)比比分布图:分布图:第6页/共22页第七页,共22页。分级分级(fn j)识别过程:识别过程:第7页/共22页第八页,共22页。识别识别(shbi)结果:结果:第8页/共22页第九页,共22页。灰度投影灰度投影灰度投影灰度投影(tuy(tuy ng)ng)源代码部分:源代码部分:源代码部分:源代码部分:*/HprojectDIB()/图像水平投影/VprojectDIB()/图像垂直投影参数:LPSTR lpDIBBits /指向源DIB图像指针 LONG lWidth /源图像宽度(像素数)LONG lHeight -源图像高度(像素数)返回值:BOOL /运算成功返回TRUE,否则返回FALSE。*要求目标图像为只有(zhyu)0和255两个灰度值的灰度图像。*第9页/共22页第十页,共22页。n nBOOL WINAPI HprojectDIB(LPSTR lpDIBBits,LONG lWidth,BOOL WINAPI HprojectDIB(LPSTR lpDIBBits,LONG lWidth,LONG lHeight)LONG lHeight)n n n n LPSTR LPSTRlpSrc;/lpSrc;/指向源图像指向源图像(t xin(t xin)的指针的指针n n LPSTR LPSTRlpDst;/lpDst;/指向缓存图像指向缓存图像(t xin(t xin)的指针的指针n n LPSTR lpNewDIBBits;/LPSTR lpNewDIBBits;/指向缓存指向缓存DIBDIB图像图像(t xin(t xin)的指针的指针n n HLOCAL HLOCALhNewDIBBits;hNewDIBBits;n n long long i;/i;/循环变量循环变量n n long long j;j;n n long long lBlackNumber;/lBlackNumber;/图像图像(t xin(t xin)中每行内的黑点个数中每行内的黑点个数n n unsigned char unsigned char pixel;pixel;/像素值像素值n n LONG lLineBytes;LONG lLineBytes;/图像图像(t xin(t xin)每行的字节数每行的字节数函数(hnsh)的声明定义(dngy)变量第10页/共22页第十一页,共22页。hNewDIBBits=LocalAlloc(LHND,lWidth*lHeight);/暂时分配内存(ni cn),以保存新图像if(hNewDIBBits=NULL)return FALSE;/分配内存(ni cn)失败lpNewDIBBits=(char*)LocalLock(hNewDIBBits);/初始化新分配的内存(ni cn),设定初始值为255lpDst=(char*)lpNewDIBBits;memset(lpDst,(BYTE)255,lWidth*lHeight);暂时(znsh)分配内存如果成功(chnggng)分配内存,则初始化新内存第11页/共22页第十二页,共22页。lLineBytes=WIDTHBYTES(lWidth*8);/计算(j sun)图像每行的字节数for(j=0;j lHeight;j+)lBlackNumber=0;for(i=0;i lWidth;i+)lpSrc=(char*)lpDIBBits+lLineBytes*j+i;/指向源图像倒数第j行,第i个象素的指针pixel=(unsigned char)*lpSrc;if(pixel!=255&pixel!=0)return false;if(pixel=0)lBlackNumber+;if(pixel=0)lBlackNumber+;计算(j sun)像素值和第12页/共22页第十三页,共22页。for(i=0;i lBlackNumber;i+)/指向目标图像(t xin)倒数第j行,第i个象素的指针 lpDst=(char*)lpNewDIBBits+lLineBytes*j+i;*lpDst=(unsigned char)0;/复制投影图像(t xin)memcpy(lpDIBBits,lpNewDIBBits,lWidth*lHeight);LocalUnlock(hNewDIBBits);/释放内存 LocalFree(hNewDIBBits);return TRUE;/返回形成新图像(t xin)(投影后的图像(t xin))复制(fzh)投影图像释放内存返回函数值 第13页/共22页第十四页,共22页。n nBOOL WINAPI VprojectDIB(LPSTR lpDIBBits,LONG lWidth,LONG lHeight)n nn n LPSTRlpSrc;/指向(zh xin)源图像的指针 n n LPSTRlpDst;/指向(zh xin)缓存图像的指针n n LPSTR lpNewDIBBits;/指向(zh xin)缓存DIB图像的指针n n HLOCAL hNewDIBBits;n n long i;n n long j;n n long lBlackNumber;/图像中每行内的黑点个数n n unsigned char pixel;/像素值n n LONG lLineBytes;/图像每行的字节数第14页/共22页第十五页,共22页。hNewDIBBits=LocalAlloc(LHND,lWidth*lHeight);/暂时分配(fnpi)内存,以保存新图像if(hNewDIBBits=NULL)return FALSE;/分配(fnpi)内存失败lpNewDIBBits=(char*)LocalLock(hNewDIBBits);/锁定内存lpDst=(char*)lpNewDIBBits;/初始化新分配(fnpi)的内存,设定初始值为255memset(lpDst,(BYTE)255,lWidth*lHeight);第15页/共22页第十六页,共22页。n nlLineBytes=WIDTHBYTES(lWidth*8);/计算图像每行的字节数n nfor(i=0;i lWidth;i+)n nn nlBlackNumber=0;n nfor(j=0;j lHeight;j+)n nn nlpSrc=(char*)lpDIBBits+lLineBytes*j+i;/指向(zh xin)源图像倒数第j行,第i个象素的指针n npixel=(unsigned char)*lpSrc;第16页/共22页第十七页,共22页。n nif(pixel!=255&pixel!=0)n nn nreturn false;n nn nif(pixel=0)n nn nlBlackNumber+;n nn nn nfor(j=0;j lBlackNumber;j+)n nn n/指向目标(mbio)图像倒数第j行,第i个象素的指针n nlpDst=(char*)lpNewDIBBits+lLineBytes*j+i;n n*lpDst=(unsigned char)0;n nn n第17页/共22页第十八页,共22页。n n/复制投影图像n nmemcpy(lpDIBBits,lpNewDIBBits,lWidth*lHeight);n nn n/释放(shfng)内存n nLocalUnlock(hNewDIBBits);n nLocalFree(hNewDIBBits);n nn n/返回n nreturn TRUE;n n第18页/共22页第十九页,共22页。第19页/共22页第二十页,共22页。第20页/共22页第二十一页,共22页。谢谢谢谢(xi xie)各位各位!Thank you!第21页/共22页第二十二页,共22页。