/***********************************************
*
* 函数名称:
* 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);
}
阅读(2590) | 评论(0) | 转发(0) |