/*****************************************************
*
* 函数名称:
* 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 {
//列
for(j=0;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 {
for(n=0;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);
}
阅读(1588) | 评论(0) | 转发(0) |