?? mydiblib.h
字號:
}
// 將新的圖像的內容拷貝到舊的圖像中
memcpy(lpDIBBits,lpNewDIBBits,lLineBytes*lHeight);
// 解除鎖定
::GlobalUnlock ((HGLOBAL)hDIB);
}
/******************************************************************
*
* 函數名稱:
* 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);
}
void Thinning(HDIB hDIB)
{
// 指向DIB的指針
LPSTR lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)hDIB);
// 指向DIB象素指針
LPSTR lpDIBBits;
// 找到DIB圖像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 指向源圖像的指針
LPSTR lpSrc;
//圖像的高度和寬度
LONG lWidth;
LONG lHeight;
//獲取圖像的寬度
lWidth=::DIBWidth ((char*)lpDIB);
//獲取圖像的高度
lHeight=::DIBHeight ((char*)lpDIB);
//計算每行的字節數
LONG lLineBytes = (lWidth+3)*4/4;
//循環變量
int i,j;
//建立存儲區存放2值矩陣
BYTE *image = (BYTE*)malloc(lWidth*lHeight*sizeof(BYTE));
//給2值矩陣賦值
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth;j++)
{
lpSrc=lpDIBBits+i*lLineBytes+j;
if(*lpSrc==0)
image[i*lWidth+j]=1;
else
image[i*lWidth+j]=0;
}
}
//調用函數進行細化,兩種函數可以選擇
ThinnerRosenfeld(image,lHeight,lWidth);
//ThinnerHilditch(image,lHeight,lWidth);
//將結果賦值到原圖像中
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth;j++)
{
lpSrc=lpDIBBits+i*lLineBytes+j;
if(image[i*lWidth+j]==1)
*lpSrc=(BYTE)0;
else
*lpSrc=(BYTE)255;
}
}
//清空內存
free(image);
::GlobalUnlock ((HGLOBAL)hDIB);
return;
}
/*****************************************************
*
* 函數名稱:
* Template:
*
* 參數:
* HDIB hDIB -圖像的句柄
* double *tem -指向模板的指針
* int tem_w -模板的寬度
* int tem_h -模板的高度
* double xishu -模板的系數
*
* 功能:
* 對圖像進行模板操作
*
* 說明:
* 為處理方便起見,模板的寬度和高度都應為奇數
*******************************************************/
HDIB Template(HDIB hDIB,double * tem ,int tem_w,int tem_h,double xishu)
{
//統計中間值
double sum;
//指向圖像起始位置的指針
BYTE *lpDIB=(BYTE*)::GlobalLock((HGLOBAL) hDIB);
//指向象素起始位置的指針
BYTE *pScrBuff =(BYTE*)::FindDIBBits((char*)lpDIB);
//獲取圖像的顏色信息
int numColors=(int) ::DIBNumColors((char *)lpDIB);
//如果圖像不是256色返回
if (numColors!=256)
{
//解除鎖定
::GlobalUnlock((HGLOBAL) hDIB);
//返回
return(hDIB);
}
//將指向圖像象素起始位置的指針,賦值給指針變量
BYTE* oldbuf = pScrBuff;
//循環變量
int i,j,m,n;
int w, h, dw;
//獲取圖像的寬度
w = (int) ::DIBWidth((char *)lpDIB);
//獲取圖像的高度
h = (int) ::DIBHeight((char *)lpDIB);
//計算圖像每行的字節數
dw = (w+3)/4*4;
//建立一個和原圖像大小相同的25色灰度位圖
HDIB newhDIB=NewDIB(w,h,8);
//指向新的位圖的指針
BYTE *newlpDIB=(BYTE*)::GlobalLock((HGLOBAL) newhDIB);
//指向新的位圖的象素起始位置的指針
BYTE *destBuf = (BYTE*)FindDIBBits((char *)newlpDIB);
//將指向新圖像象素起始位置的指針,賦值給指針變量
BYTE *newbuf=destBuf;
//對圖像進行掃描
//行
for(i=0;i<h;i++)
{
//列
for(j=0;j<w;j++)
{
//為統計變量賦初始值
sum=0;
//對于圖像的4個邊框的象素保持原灰度不變
if( j<((tem_w-1)/2) || j>(w-(tem_w+1)/2) || i<((tem_h-1)/2) || i>(h-(tem_h+1)/2) )
*(newbuf+i*dw+j)=*(oldbuf+i*dw+j);
//對于其他的象素進行模板操作
else
{
//將點(i,j)點作為模板的中心
for(m=i-((tem_h-1)/2);m<=i+((tem_h-1)/2);m++)
{
for(n=j-((tem_w-1)/2);n<=j+((tem_w-1)/2);n++)
//將以點(i,j)為中心,與模板大小相同的范圍內的象素與模板對用位置的系數
//進行相乘并線形疊加
sum+=*(oldbuf+m*dw+n)* tem[(m-i+((tem_h-1)/2))*tem_w+n-j+((tem_w-1)/2)];
}
//將結果乘上總的模板系數
sum=(int)sum*xishu;
//計算絕對值
sum = fabs(sum);
//如果小于0,強制賦值為0
if(sum<0)
sum=0;
//如果大于255,強制賦值為255
if(sum>255)
sum=255;
//將計算的結果放到新的位圖的相應位置
*(newbuf+i*dw+j)=sum;
}
}
}
//解除鎖定
::GlobalUnlock((HGLOBAL)hDIB);
//返回新的位圖的句柄
return(newhDIB);
}
/*****************************************************
*
* 函數名稱:
* Template:
*
* 參數:
* HDIB hDIB -圖像的句柄
* int tem_w -模板的寬度
* int tem_h -模板的高度
*
* 功能:
* 對圖像進行中值
*
* 說明:
* 為處理方便起見,模板的寬度和高度都應為奇數
*******************************************************/
HDIB MidFilter(HDIB hDIB,int tem_w,int tem_h)
{
//統計中間值
double mid;
BYTE *temp=(BYTE*)malloc(tem_w*tem_h*sizeof(BYTE));
//指向圖像起始位置的指針
BYTE *lpDIB=(BYTE*)::GlobalLock((HGLOBAL) hDIB);
//指向象素起始位置的指針
BYTE *pScrBuff =(BYTE*)::FindDIBBits((char*)lpDIB);
//獲取圖像的顏色信息
int numColors=(int) ::DIBNumColors((char *)lpDIB);
//如果圖像不是256色返回
if (numColors!=256)
{
//解除鎖定
::GlobalUnlock((HGLOBAL) hDIB);
//返回
return(hDIB);
}
//將指向圖像象素起始位置的指針,賦值給指針變量
BYTE* oldbuf = pScrBuff;
//循環變量
int i,j,m,n;
int w, h, dw;
//獲取圖像的寬度
w = (int) ::DIBWidth((char *)lpDIB);
//獲取圖像的高度
h = (int) ::DIBHeight((char *)lpDIB);
//計算圖像每行的字節數
dw = (w+3)/4*4;
//建立一個和原圖像大小相同的25色灰度位圖
HDIB newhDIB=NewDIB(w,h,8);
//指向新的位圖的指針
BYTE *newlpDIB=(BYTE*)::GlobalLock((HGLOBAL) newhDIB);
//指向新的位圖的象素起始位置的指針
BYTE *destBuf = (BYTE*)FindDIBBits((char *)newlpDIB);
//將指向新圖像象素起始位置的指針,賦值給指針變量
BYTE *newbuf=destBuf;
//對圖像進行掃描
//行
for(i=0;i<h;i++)
{
//列
for(j=0;j<w;j++)
{
//為統計變量賦初始值
//對于圖像的4個邊框的象素保持原灰度不變
if( j<((tem_w-1)/2) || j>(w-(tem_w+1)/2) || i<((tem_h-1)/2) || i>(h-(tem_h+1)/2) )
*(newbuf+i*dw+j)=*(oldbuf+i*dw+j);
//對于其他的象素進行模板操作
else
{
//將點(i,j)點作為模板的中心
for(m=i-((tem_h-1)/2);m<=i+((tem_h-1)/2);m++)
{
for(n=j-((tem_w-1)/2);n<=j+((tem_w-1)/2);n++)
//將以點(i,j)為中心,與模板大小相同的范圍內的象素傳遞到模板矩陣中
temp[(m-i+((tem_h-1)/2))*tem_w+n-j+((tem_w-1)/2)]=*(oldbuf+m*dw+n);
}
//利用氣泡法計算中值
for(m=0;m<tem_w*tem_h-1;m++)
{
for(n=0;n<tem_w*tem_h-m-1;n++)
{
if(temp[n]>temp[n+1])
mid=temp[n];
temp[n]=temp[n+1];
temp[n+1]=mid;
}
}
//將計算的結果放到新的位圖的相應位置
*(newbuf+i*dw+j)=temp[(tem_w*tem_h-1)/2];
}
}
}
//解除鎖定
::GlobalUnlock((HGLOBAL)hDIB);
//返回新的位圖的句柄
return(newhDIB);
}
/*************************************************************************
*
* 函數名稱:
* Equalize()
*
* 參數:
* HDIB hDIB
*
*
* 說明:
* 該函數用來對圖像進行直方圖均衡。
*
************************************************************************/
void Equalize(HDIB hDIB)
{
BYTE* lpDIB=(BYTE*)::GlobalLock ((HGLOBAL)hDIB);
BYTE* lpDIBBits=(BYTE*)::FindDIBBits((char*)lpDIB);
LONG lHeight=::DIBHeight ((char*)lpDIB);
LONG lWidth=::DIBWidth ((char*)lpDIB);
// 指向源圖像的指針
unsigned char* lpSrc;
// 臨時變量
LONG lTemp;
// 循環變量
LONG i;
LONG j;
// 灰度映射表
BYTE bMap[256];
// 灰度映射表
LONG lCount[256];
// 圖像每行的字節數
LONG lLineBytes;
// 計算圖像每行的字節數
lLineBytes = WIDTHBYTES(lWidth * 8);
// 重置計數為0
for (i = 0; i < 256; i ++)
{
// 清零
lCount[i] = 0;
}
// 計算各個灰度值的計數
for (i = 0; i < lHeight; i ++)
{
for (j = 0; j < lWidth; j ++)
{
lpSrc = (unsigned char *)lpDIBBits + lLineBytes * i + j;
// 計數加1
lCount[*(lpSrc)]++;
}
}
// 計算灰度映射表
for (i = 0; i < 256; i++)
{
// 初始為0
lTemp = 0;
for (j = 0; j <= i ; j++)
{
lTemp += lCount[j];
}
// 計算對應的新灰度值
bMap[i] = (BYTE) (lTemp * 255 / lHeight / lWidth);
}
// 每行
for(i = 0; i < lHeight; i++)
{
// 每列
for(j = 0; j < lWidth; j++)
{
// 指向DIB第i行,第j個象素的指針
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
// 計算新的灰度值
*lpSrc = bMap[*lpSrc];
}
}
::GlobalUnlock ((HGLOBAL)hDIB);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -