圖像預處理第7步:標準歸一化
將分割出來的各個不一樣寬、高的數字字符寬、高統一 緩存
//圖像預處理第7步:標準歸一化 //將分割出來的各個不一樣寬、高的數字字符寬、高統一 void CChildView::OnImgprcStandarize() { StdDIBbyRect(m_hDIB,w_sample,h_sample); //在屏幕上顯示位圖 CDC* pDC=GetDC(); DisplayDIB(pDC,m_hDIB); DrawFrame(pDC,m_hDIB,m_charRect,2,RGB(21,255,25)); gyhfinished=true; }
/****************************************************************** * * 函數名稱: * StdDIBbyRect() * * 參數: * HDIB hDIB -圖像的句柄 * int tarWidth -標準化的寬度 * int tarHeight -標準化的高度 * * 返回值: * 無 * * 功能: * 將通過分割的字符,進行縮放處理使他們的寬和高一直,以方便特徵的提取 * * 說明: * 函數中用到了,每一個字符的位置信息,因此必須在執行完分割操做以後才能執行標準化操做 * ******************************************************************/ void StdDIBbyRect(HDIB hDIB, int tarWidth, int tarHeight) { //指向圖像的指針 BYTE* lpDIB=(BYTE*)::GlobalLock ((HGLOBAL)hDIB); //指向象素起始位置的指針 BYTE* lpDIBBits=(BYTE*)::FindDIBBits ((char*)lpDIB); //指向象素的指針 BYTE* lpSrc; //獲取圖像的的寬度 LONG lWidth=::DIBWidth ((char*)lpDIB); //獲取圖像的高度 LONG lHeight=::DIBHeight ((char*)lpDIB); // 循環變量 int i; int j; // 圖像每行的字節數 LONG lLineBytes = WIDTHBYTES(lWidth * 8); //寬度、高度方向上的縮放因子 double wscale,hscale; //開闢一塊臨時緩存區,來存放變化後的圖像信息 LPSTR lpNewDIBBits; LPSTR lpDst; //緩存區的大小和原圖像的數據區大小同樣 HLOCAL nNewDIBBits=LocalAlloc(LHND,lLineBytes*lHeight); //指向緩存區開始位置的指針 lpNewDIBBits=(char*)LocalLock(nNewDIBBits); //指向緩存內信息的指針 lpDst=(char*)lpNewDIBBits; //將緩存區的內容賦初始值 memset(lpDst,(BYTE)255,lLineBytes*lHeight); //進行映射操做的座標變量 int i_src,j_src; //存放字符位置信息的結構體 CRect rect; CRect rectnew; //先清空一個新的矩形區域鏈表以便存儲標準化後的矩形區域鏈表 m_charRectCopy.clear (); //從頭至尾逐個掃描各個結點 while(!m_charRect.empty()) { //從表頭上獲得一個矩形 rect= m_charRect.front(); //從鏈表頭上面刪掉一個 m_charRect.pop_front(); //計算縮放因子 //橫座標方向的縮放因子 wscale=(double)tarWidth/rect.Width (); //縱座標方向的縮放因子 hscale=(double)tarHeight/rect.Height (); //計算標準化矩形 //上邊界 rectnew.top =rect.top ; //下邊界 rectnew.bottom =rect.top +tarHeight; //左邊界 rectnew.left =rect.left ; //右邊界 rectnew.right =rectnew.left +tarWidth; //將原矩形框內的象素映射到新的矩形框內 for(i=rectnew.top ;i<rectnew.bottom ;i++) { for(j=rectnew.left ;j<rectnew.right ;j++) { //計算映射座標 i_src=rectnew.top +int((i-rectnew.top )/hscale); j_src=rectnew.left +int((j-rectnew.left )/wscale); //將相對應的象素點進行映射操做 lpSrc=(unsigned char *)lpDIBBits + lLineBytes * i_src + j_src; lpDst = (char *)lpNewDIBBits + lLineBytes * i + j; *lpDst=*lpSrc; } } //將標準化後的矩形區域插入新的鏈表 m_charRectCopy.push_back (rectnew); } //存儲標準化後新的rect區域 m_charRect=m_charRectCopy; //將緩存區的內容拷貝到圖像的數據區內 memcpy(lpDIBBits,lpNewDIBBits,lLineBytes*lHeight); //解除鎖定 ::GlobalUnlock ((HGLOBAL)hDIB); }
運行效果:函數