现在的位置: 首页 > 综合 > 正文

数字图像空间滤波常用的函数VC代码:模板卷积处理函数,中值滤波函数

2013年06月23日 ⁄ 综合 ⁄ 共 4921字 ⁄ 字号 评论关闭

        图像空间滤波常用的函数:模板卷积处理函数,中值滤波函数

/*************************************************************************
 * /函数名称:
 *  Template()
 * /输入参数:
 *  LPSTR lpDIBBits  - 指向源图像的像素指针
 *  LONG lmageWidth  - 源图像的宽度
 *  LONG lmageHeight  - 源图像的高度
 *   int nTempWidth      - 模板的宽度
 *   int nTempHeight  - 模板的高度
 *   int nTempCenX      - 模板中心的X坐标(相对于模板)
 *   int nTempCenY      - 模板中心的Y坐标(相对于模板)
 *   double* Tempdata  - 模板数组的指针
 *   double* TempCoef  - 模板的系数
 * /返回值:
 *   BOOL   - 成功则返回TRUE,否则返回FALSE
 * /说明:
 *   该函数用指定的模板对lpDIBBits指向的图象进行模板操作。模板的定义了宽度,高度,中心坐标
*和系数,模板的数据存放在Tempdata中。对图象进行模板操作后,仍然存放在lpDIBBits指向的对象
*中。需要注意的是,该函数只能处理8位的图象,否则,指向的数据将出错。
 **************************************************************************/
BOOL  Template(LPSTR lpDIBBits, LONG lmageWidth, LONG lmageHeight,
      int nTempWidth, int nTempHeight,
      int nTempCenX, int nTempCenY,
      double* Tempdata, double TempCoef)
{
 LPBYTE  lpImage;        // 临时存放图像数据的指针
 int   i,j,k,l;         // 循环变量
 unsigned char* lpSrc;         // 指向源图像的指针
 unsigned char* lpDst;         // 指向要复制区域的指针
 double dbResult;          // 计算结果
 lpImage = (LPBYTE) new  char[lmageWidth*lmageHeight];   // 分配内存
 if (lpImage == NULL)          // 判断是否内存分配失败
 {
  return FALSE;          // 分配内存失败
 }
 
 // 将原始图像的数据拷贝到临时存放内存中
 memcpy(lpImage, lpDIBBits, lmageWidth*lmageHeight);
 // 进行模板计算,行(除去边缘几行)
 for(i = nTempCenY ; i <lmageHeight - nTempHeight + nTempCenY + 1; i++)
 {
  // 列(除去边缘几列)
  for(j = nTempCenX; j < lmageWidth - nTempWidth + nTempCenX + 1; j++)
  {
   // 指向新DIB第i行,第j个象素的指针
   lpDst = (unsigned char*)lpImage + lmageWidth * (lmageHeight - 1 - i) + j;
   dbResult = 0;          // 置0
   for (k = 0; k < nTempHeight; k++)
   {
    for (l = 0; l < nTempWidth; l++)
    {
     // 指向DIB第i - iFilterMY + k行,第j - iFilterMX + l个象素的指针
     lpSrc = (unsigned char*)lpDIBBits + lmageWidth * (lmageHeight - 1 - i + nTempCenY - k) + j - nTempCenX + l;
     dbResult += (* lpSrc) * Tempdata[k * nTempWidth + l]; // 保存象素值
    }
   }
   dbResult *= TempCoef;        // 乘上系数
   dbResult = (double ) fabs(dbResult);    // 取绝对值
   if(dbResult > 255)         // 判断是否超过255
   {
    * lpDst = 255;         // 直接赋值为255
   }
   else
   {
    * lpDst = (unsigned char) (dbResult + 0.5);    // 赋值
   }
  }
 }
 memcpy(lpDIBBits, lpImage, lmageWidth*lmageHeight);    //复制变换后的图像
 delete[] lpImage;            // 释放内存
 return TRUE;            // 返回
}

/*************************************************************************
* 函数名称:
 *   MedianValue()
* 参数:
 *   unsigned char * FiltValue - 指向要获取中值的数组指针
 *   int   iFilterLen    - 数组长度
* 返回值:
 *   unsigned char    - 返回指定数组的中值。
* 说明:
 *   该函数用冒泡法对一维数组进行排序,并返回数组元素的中值。
************************************************************************/

unsigned char  MedianValue(unsigned char * FiltValue, int mFilterLen)
{
 int  i;          // 循环变量
 int  j;          // 循环变量
 unsigned char Temp;        // 中间变量
 // 用冒泡法对数组进行排序
 for (j = 0; j < mFilterLen - 1; j ++)
 {
  for (i = 0; i < mFilterLen - j - 1; i ++)
  {
   if (FiltValue[i] > FiltValue[i + 1])   // 前面的值大于后面的
   {
    Temp = FiltValue[i];
    FiltValue[i] = FiltValue[i + 1];   // 二者的值互换
    FiltValue[i + 1] = Temp;
   }
  }
 }
 if ((mFilterLen & 1) > 0)        // 计算中值
 {
  //数组有奇数个元素,返回中间一个元素
  Temp = FiltValue[(mFilterLen + 1) / 2];
 }
 else
 {
  //数组有偶数个元素,返回中间两个元素平均值
  Temp = (FiltValue[mFilterLen / 2] + FiltValue[mFilterLen / 2 + 1]) / 2;
 }
 return Temp;          // 返回中值
}

 

/*************************************************************************
* 函数名称:
 *   MedianFilter()
* 参数:
 *   LPSTR lpDIBBits   - 指向源DIB图像指针
 *   LONG  lmageWidth   - 源图像宽度(象素数)
 *   LONG  lmageHeight   - 源图像高度(象素数)
 *   int   mFilterH    - 滤波器的高度
 *   int   mFilterW    - 滤波器的宽度
 *   int   mFilterMX   - 滤波器的中心元素X坐标
 *   int   mFilterMY   - 滤波器的中心元素Y坐标
* 返回值:
 *   BOOL      - 成功返回TRUE,否则返回FALSE。
 * 说明:
 *   该函数对DIB图像进行中值滤波。
************************************************************************/

BOOL  MedianFilter(LPSTR lpDIBBits, LONG lmageWidth, LONG lmageHeight,
       int mFilterH, int mFilterW, int mFilterMX, int mFilterMY)
{
 unsigned char* lpSrc;        // 指向源图像的指针
 unsigned char* lpDst;        // 指向要复制区域的指针
 LPBYTE lpImage;         // 指向复制图像的指针
 unsigned char* FiltValue;        // 指向滤波器数组的指针
 int   i;         // 循环变量
 int   j;         // 循环变量
 int   k;         // 循环变量
 int   l;         // 循环变量
 lpImage = (LPBYTE) new char[lmageWidth *lmageHeight];  // 暂时分配内存,以保存新图像
 if (lpImage == NULL)         // 判断是否内存分配失败
 {
  return FALSE;         // 分配内存失败
 } 
 memcpy(lpImage, lpDIBBits, lmageWidth *lmageHeight);  // 初始化图像为原始图像
 FiltValue = new unsigned char[mFilterH *mFilterW];   // 暂时分配内存,以保存滤波器数组
 if (FiltValue == NULL)        // 判断是否内存分配失败
 {
  delete[]lpImage;         // 释放已分配内存
  return FALSE;         // 分配内存失败
 }
 // 开始中值滤波
 for(i = mFilterMY; i < lmageHeight - mFilterH + mFilterMY + 1; i++)
 {
  for(j = mFilterMX; j < lmageWidth - mFilterW + mFilterMX + 1; j++)
  {
   // 指向新DIB第i行,第j个象素的指针
   lpDst = (unsigned char*)lpImage + lmageWidth * (lmageHeight - 1 - i) + j;
   for (k = 0; k < mFilterH; k++)     // 读取滤波器数组
   {
    for (l = 0; l < mFilterW; l++)
    {
     // 指向DIB第i - iFilterMY + k行,第j - iFilterMX + l个象素的指针
     lpSrc = (unsigned char*)lpDIBBits + lmageWidth  * (lmageHeight - 1 - i + mFilterMY
        - k) + j - mFilterMX + l;
     FiltValue[k * mFilterW + l] = *lpSrc;  // 保存象素值
    }
   }
   *lpDst= MedianValue(FiltValue, (mFilterH * mFilterW)); // 获取中值
  }
 }
 memcpy(lpDIBBits, lpImage, lmageWidth*lmageHeight);   // 复制变换后的图像
 delete[]lpImage;          // 释放内存
 delete[]FiltValue;
 return TRUE;          // 返回
}

【上篇】
【下篇】

抱歉!评论已关闭.