图像锐化【检测和完善过代码】
源文链接:http://blog.csdn.net/jianxiong8814/article/details/1599234此函数利用Lapacian算子实现了图像的锐化,可见于《数字图像获取,处理及实践应用》此书第四章p175页有此程序及相关详细算法说明,下面的程序已经经过在下的修改,接口更好。
/*************************************************************************
*
* /函数名称:
* LinearSharpen()
*
* /输入参数:
* unsigned char* lpImage - 指向图象数据得指针
* int nWidth - 图象数据宽度
* int nHeight - 图象数据高度
* unsigned char* SharpenImage - 指向输出图像数据的指针
*
* /返回值:
* 无
*
* /说明:
* 线性锐化图象增强
* 本函数采用拉普拉斯算子对图象进行线性锐化
* 在原来图象上加上拉普拉斯算子锐化的信息
*
*************************************************************************
*/
void LinearSharpen(unsigned char* lpImage, int nWidth, int nHeight, unsigned char* SharpenImage)
{
// 遍历图象的纵坐标
int y;
// 遍历图象的横坐标
int x;
double * pdGrad ;
// 设置模板系数
static int nWeight[3][3] = {{-1,-1,-1},{-1,8,-1},{-1,-1,-1}};
//这个变量用来表示Laplacian算子象素值
int nTmp[3][3];
// 临时变量
double dGrad;
// 模板循环控制变量
int yy ;
int xx ;
pdGrad = (double *)malloc(nWidth*nHeight*sizeof(double));
// 初始化为0
memset(pdGrad, 0, nWidth*nHeight*sizeof(double));
for(y=1; y<nHeight-1 ; y++ )
for(x=1 ; x<nWidth-1 ; x++ )
{
dGrad = 0 ;
// Laplacian算子需要的各点象素值
// 模板第一行
nTmp[0][0] = lpImage[(y-1)*nWidth + x - 1 ] ;
nTmp[0][1] = lpImage[(y-1)*nWidth + x ] ;
nTmp[0][2] = lpImage[(y-1)*nWidth + x + 1 ] ;
// 模板第二行
nTmp[1][0] = lpImage[y*nWidth + x - 1 ] ;
nTmp[1][1] = lpImage[y*nWidth + x ] ;
nTmp[1][2] = lpImage[y*nWidth + x + 1 ] ;
// 模板第三行
nTmp[2][0] = lpImage[(y+1)*nWidth + x - 1 ] ;
nTmp[2][1] = lpImage[(y+1)*nWidth + x ] ;
nTmp[2][2] = lpImage[(y+1)*nWidth + x + 1 ] ;
// 计算梯度
for(yy=0; yy<3; yy++)
for(xx=0; xx<3; xx++)
{
dGrad += nTmp[yy][xx] * nWeight[yy][xx] ;
}
// 梯度值写入内存
*(pdGrad+y*nWidth+x)=dGrad;
}
for(y=0; y<nHeight ; y++ )
{
for(x=0 ; x<nWidth ; x++ )
{
int temp = lpImage[y*nWidth+x] + (int)pdGrad[y*nWidth+x];
if(temp > 255)
temp = 255;
else if(temp < 0)
temp = 0;
SharpenImage[y*nWidth+x] = (unsigned char)temp;
}
free(pdGrad) ;
pdGrad = NULL ;
}