?? mydiblib.h
字號:
DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x,y-1,lab,lianXuShu);
//判斷長度
//如果連續長度滿足要求,說明不是離散點,返回
if(m_lianXuShu>=lianXuShu)
return TRUE;
//左下點
lpSrc=(char*)lpDIBBits + lLineBytes * (y-1) + x-1;
//傳遞灰度值
gray=*lpSrc;
//如果點在圖像內、顏色為黑色并且沒有被訪問過
if(y-1 >=0 && x-1 >=0 && gray== 0 && lplab[(y-1)*lWidth+x-1] == false)
//進行遞歸處理
DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x-1,y-1,lab,lianXuShu);
//判斷長度
//如果連續長度滿足要求,說明不是離散點,返回
if(m_lianXuShu>=lianXuShu)
return TRUE;
//左邊
lpSrc=(char*)lpDIBBits + lLineBytes * y + x-1;
//傳遞灰度值
gray=*lpSrc;
//如果點在圖像內、顏色為黑色并且沒有被訪問過
if(x-1 >=0 && gray== 0 && lplab[y*lWidth+x-1] == false)
//進行遞歸處理
DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x-1,y,lab,lianXuShu);
//判斷長度
//如果連續長度滿足要求,說明不是離散點,返回
if(m_lianXuShu>=lianXuShu)
return TRUE;
//左上
lpSrc=(char*)lpDIBBits + lLineBytes * (y+1) + x-1;
//傳遞灰度值
gray=*lpSrc;
//如果點在圖像內、顏色為黑色并且沒有被訪問過
if(y+1 <lHeight && x-1 >= 0 && gray == 0 && lplab[(y+1)*lWidth+x-1] == false)
//進行遞歸處理
DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x-1,y+1,lab,lianXuShu);
//判斷長度
//如果連續長度滿足要求,說明不是離散點,返回
if(m_lianXuShu>=lianXuShu)
return TRUE;
//上面
lpSrc=(char*)lpDIBBits + lLineBytes * (y+1) + x;
//傳遞灰度值
gray=*lpSrc;
//如果點在圖像內、顏色為黑色并且沒有被訪問過
if(y+1 < lHeight && gray == 0 && lplab[(y+1)*lWidth+x] == false)
//進行遞歸處理
DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x,y+1,lab,lianXuShu);
//判斷長度
//如果連續長度滿足要求,說明不是離散點,返回
if(m_lianXuShu>=lianXuShu)
return TRUE;
//右上
lpSrc=(char*)lpDIBBits + lLineBytes * (y+1) + x+1;
//傳遞灰度值
gray=*lpSrc;
//如果點在圖像內、顏色為黑色并且沒有被訪問過
if(y+1 <lHeight && x+1 <lWidth && gray == 0 && lplab[(y+1)*lWidth+x+1] == false)
//進行遞歸處理
DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x+1,y+1,lab,lianXuShu);
//判斷長度
//如果連續長度滿足要求,說明不是離散點,返回
if(m_lianXuShu>=lianXuShu)
return TRUE;
//右邊
lpSrc=(char*)lpDIBBits + lLineBytes * y + x+1;
//傳遞灰度值
gray=*lpSrc;
//如果點在圖像內、顏色為黑色并且沒有被訪問過
if(x+1 <lWidth && gray==0 && lplab[y*lWidth+x+1] == false)
//進行遞歸處理
DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x+1,y,lab,lianXuShu);
//判斷長度
//如果連續長度滿足要求,說明不是離散點,返回
if(m_lianXuShu>=lianXuShu)
return TRUE;
//右下
lpSrc=(char*)lpDIBBits + lLineBytes * (y-1) + x+1;
//傳遞灰度值
gray=*lpSrc;
//如果點在圖像內、顏色為黑色并且沒有被訪問過
if(y-1 >=0 && x+1 <lWidth && gray == 0 && lplab[(y-1)*lWidth+x+1] == false)
//進行遞歸處理
DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x+1,y-1,lab,lianXuShu);
//判斷長度
//如果連續長度滿足要求,說明不是離散點,返回
if(m_lianXuShu>=lianXuShu)
return TRUE;
}
//如果遞歸結束,返回false,說明是離散點
return FALSE;
}
/*****************繪制數字字符外面的矩形框*******************/
void DrawFrame(CDC* pDC,HDIB hDIB, CRectLink charRect,unsigned int linewidth,COLORREF color)
{
CPen pen;
pen.CreatePen (PS_SOLID,linewidth,color);
pDC->SelectObject (&pen);
::SelectObject (*pDC,GetStockObject(NULL_BRUSH));
CRect rect,rect2;
BYTE* lpDIB=(BYTE*)::GlobalLock ((HGLOBAL)hDIB);
while(!charRect.empty())
{
//從表頭上得到一個矩形
rect2=rect= charRect.front();
//從鏈表頭上面刪掉一個
charRect.pop_front();
//注意,這里原先的rect是相對于圖像原點(左下角)的,
//而在屏幕上繪圖時,要轉換以客戶區為原點的坐標
rect.top =::DIBHeight ((char*)lpDIB)-rect2.bottom;
rect.bottom =::DIBHeight ((char*)lpDIB)-rect2.top ;
pDC->Rectangle (&rect);
}
::GlobalUnlock ((HGLOBAL)hDIB);
}
/***********************************************
*
* 函數名稱:
* GradientSharp()
*
*參數 :
* HDIB hDIB -待處理圖像的句柄
*
* 返回值:
* 無
*
*功能:
* 現圖像的梯度銳化
*說明:
* 只能對2值圖像進行處理,如果圖像本身邊緣較細,可能造成信息的損失
**********************************************************************/
void GradientSharp(HDIB hDIB)
{
// 指向DIB的指針
LPSTR lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)hDIB);
// 指向DIB象素指針
LPSTR lpDIBBits;
// 找到DIB圖像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
//獲取圖像的寬度
LONG lWidth=::DIBWidth ((char*)lpDIB);
//獲取圖像的長度
LONG lHeight=::DIBHeight ((char*)lpDIB);
// 閾值
BYTE bThre = 2;
// 調用GradSharp()函數進行梯度板銳化
// 指向源圖像的指針
unsigned char* lpSrc;
unsigned char* lpSrc1;
unsigned char* lpSrc2;
// 循環變量
LONG i;
LONG j;
// 圖像每行的字節數
LONG lLineBytes;
// 中間變量
BYTE bTemp;
// 計算圖像每行的字節數
lLineBytes = WIDTHBYTES(lWidth * 8);
// 每行
for(i = 0; i < lHeight; i++)
{
// 每列
for(j = 0; j < lWidth; j++)
{
// 指向DIB第i行,第j個象素的指針
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
// 指向DIB第i+1行,第j個象素的指針
lpSrc1 = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 2 - i) + j;
// 指向DIB第i行,第j+1個象素的指針
lpSrc2 = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j + 1;
//計算梯度值
bTemp = abs((*lpSrc)-(*lpSrc1)) + abs((*lpSrc)-(*lpSrc2));
// 判斷是否小于閾值
if (bTemp < 255)
{
// 判斷是否大于閾值,對于小于情況,灰度值不變。
if (bTemp >= bThre)
{
// 直接賦值為bTemp
*lpSrc = bTemp;
}
}
else
{
// 直接賦值為255
*lpSrc = 255;
}
}
}
//最后還要處理一下圖像中最下面那行
for(j = 0; j < lWidth; j++)
{
//指向最下邊一行,第j個象素的指針
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * 0 + j;
//將此位置的象素設置為255,即白點
*lpSrc=255;
}
//解除鎖定
::GlobalUnlock ((HGLOBAL)hDIB);
}
/************************************************************
*
* 函數名稱:
* RemoveScatterNoise()
*
* 參數:
* HDIB hDIB -原圖像的句柄
*
* 返回值:
* 無
*
* 功能:
* 通過對連續點長度的統計來去除離散雜點
*
* 說明:
* 只能對2值圖像進行處理
****************************************************************/
void RemoveScatterNoise(HDIB hDIB)
{
// 指向DIB的指針
LPSTR lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)hDIB);
// 指向DIB象素指針
LPSTR lpDIBBits;
// 找到DIB圖像象素數據區的起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
//獲得圖像的長度
LONG lWidth=::DIBWidth ((char*)lpDIB);
//獲得圖像的高度
LONG lHeight=::DIBHeight ((char*)lpDIB);
//設置判定噪聲的長度閾值為15
//即如果與考察點相連接的黑點的數目小于15則認為考察點是噪聲點
int length=15;
// 循環變量
m_lianXuShu=0;
LONG i;
LONG j;
LONG k;
// 圖像每行的字節數
LONG lLineBytes;
// 計算圖像每行的字節數
lLineBytes = WIDTHBYTES(lWidth * 8);
LPSTR lpSrc;
//開辟一塊用來存放標志的內存數組
LPBYTE lplab = new BYTE[lHeight * lWidth];
//開辟一塊用來保存離散判定結果的內存數組
bool *lpTemp = new bool[lHeight * lWidth];
//初始化標志數組
for (i=0;i<lHeight*lWidth;i++)
{
//將所有的標志位設置為非
lplab[i] = false;
}
//用來存放離散點的坐標的數組
CPoint lab[21];
//為循環變量賦初始值
k=0;
//掃描整個圖像
//逐行掃描
for(i =0;i<lHeight;i++)
{
//逐行掃描
for(j=0;j<lWidth;j++)
{
//先把標志位置false
for(k=0;k<m_lianXuShu;k++)
lplab[lab[k].y * lWidth + lab[k].x] = false;
//連續數置0
m_lianXuShu =0;
//進行離散性判斷
lpTemp[i*lWidth+j] = DeleteScaterJudge(lpDIBBits,(WORD)lLineBytes,lplab,lWidth,lHeight,j,i,lab,length);
}
}
//掃描整個圖像,把離散點填充成白色
//逐行掃描
for(i = 0;i<lHeight;i++)
{
//逐列掃描
for(j=0;j<lWidth;j++)
{
//查看標志位,如果為非則將此點設為白點
if(lpTemp[i*lWidth+j] == false)
{
//指向第i行第j個象素的指針
lpSrc=(char*)lpDIBBits + lLineBytes * i + j;
//將此象素設為白點
*lpSrc=BYTE(255);
}
}
}
//解除鎖定
::GlobalUnlock ((HGLOBAL)hDIB);
}
/*********************************************************
* 函數名稱:
* SlopeAdjust()
*
* 參數:
* HDIB hDIB -原圖像的句柄
*
* 返回值:
* 無
*
* 功能:
* 通過對圖像左右半邊平均高度的統計來進行傾斜的調整
*
* 說明:
* 只能對2值圖像進行處理
*
****************************************************************/
void SlopeAdjust(HDIB hDIB)
{
// 指向DIB的指針
LPSTR lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)hDIB);
// 指向DIB象素指針
LPSTR lpDIBBits;
// 找到DIB圖像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 指向源圖像的指針
unsigned char* lpSrc;
// 循環變量
LONG i;
LONG j;
// 圖像每行的字節數
LONG lLineBytes;
//圖像的長度
LONG lWidth;
//圖像的寬度
LONG lHeight;
//獲取圖像的長度
lWidth=::DIBWidth ((char*)lpDIB);
//獲取圖像的寬度
lHeight=::DIBHeight ((char*)lpDIB);
// 計算圖像每行的字節數
lLineBytes = WIDTHBYTES(lWidth * 8);
//圖像左半邊的平均高度
double leftaver=0.0;
//圖像右半邊的平均高度
double rightaver=0.0;
//圖像的傾斜度
double slope;
//統計循環變量
LONG counts=0;
//掃描左半邊的圖像,求黑色象素的平均高度
//行
for (i=0;i<lHeight;i++)
{
//列
for (j=0;j<lWidth/2;j++)
{
//指向第i行第j個象素的指針
lpSrc=(unsigned char*)lpDIBBits + lLineBytes * i + j;
//如果為黑點
if (*lpSrc == 0)
{
//對其高度進行統計疊加
counts +=lWidth/2 -j;
leftaver += i*(lWidth/2 -j);
}
}
}
//計算平均高度
leftaver /= counts;
//將統計循環變量重新賦值
counts =0;
//掃描右半邊的圖像,求黑色象素的平均高度
//行
for (i =0;i<lHeight;i++)
{
//列
for (j=lWidth/2;j<lWidth;j++)
{
//指向第i行第j個象素的指針
lpSrc=(unsigned char*)lpDIBBits + lLineBytes * i + j;
//如果為黑點
if (*lpSrc == 0)
{
//進行統計疊加
counts +=lWidth -j;
rightaver += i*(lWidth -j);
}
}
}
//計算右半邊的平均高度
rightaver /= counts;
//計算斜率
slope = (leftaver - rightaver) / (lWidth/2);
//指向新的圖像象素起始位置的指針
LPSTR lpNewDIBBits;
//指向新圖像的指針
LPSTR lpDst;
//新圖像的句柄
HLOCAL nNewDIBBits=LocalAlloc(LHND,lLineBytes*lHeight);
//鎖定內存
lpNewDIBBits=(char*)LocalLock(nNewDIBBits);
//指向新圖像象素的指針
lpDst=(char*)lpNewDIBBits;
//為新圖像賦初始值
memset(lpDst,(BYTE)255,lLineBytes*lHeight);
//象素點的灰度值
int gray;
//位置映射值
int i_src;
//根據斜率,把當前新圖像的點映射到源圖像的點
//行
for (i=0;i<lHeight;i++)
{
//列
for (j=0;j<lWidth;j++)
{
//計算映射位置
i_src=int(i - (j-lWidth/2)*slope);
//如果點在圖像外,象素置白色
if (i_src <0 || i_src >=lHeight )
gray = 255;
else
{
//否則到源圖像中找點,取得象素值
//指向第i_src行第j個象素的指針
lpSrc=(unsigned char *)lpDIBBits + lLineBytes * i_src + j;
gray = *lpSrc;
}
//把新圖像的點用得到的象素值填充
//指向第i行第j個象素的指針
lpDst = (char *)lpNewDIBBits + lLineBytes * i + j;
*lpDst=gray;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -