• 大小: 1KB
    文件类型: .7z
    金币: 1
    下载: 0 次
    发布日期: 2021-05-29
  • 语言: C/C++
  • 标签: 中值滤波  

资源简介

使用C语言实现的中值滤波程序,可直接嵌入,模块化设计-可复用性高!

资源截图

代码片段和文件信息

/*************************************************************************
 * 函数名称:
 *   MedianFilter()
 * 参数:
 *   int   iFilterH - 滤波器的高度
 *   int   iFilterW - 滤波器的宽度
 *   int   iFilterMX - 滤波器的中心元素X坐标
 *   int   iFilterMY - 滤波器的中心元素Y坐标
 * 说明:
 *   该函数对DIB图像进行中值滤波。
 ************************************************************************/
#define iFilterW 1
#define iFilterH 1
#define iFilterMX 1
#define iFilterMY 1
#define WIDTHBYTES(bits)    (((bits) + 31) / 32 * 4)


unsigned char GetMedianNum(int * bArray int iFilterLen);
void MedianFilter(unsigned char *pImg1unsigned char *pImgint nWidthint nHeight)
{
    unsigned char   *lpSrc;                 // 指向源图像的指针
unsigned char   *lpDst;                   // 指向要复制区域的指针
int         aValue[iFilterH*iFilterW];     // 指向滤波器数组的指针
int ijkl;                     // 循环变量
int lLineBytes;                     // 图像每行的字节数
lLineBytes = WIDTHBYTES(nWidth * 8);
for ( i=0;i (*pImg)=0;
// 开始中值滤波
// 行(除去边缘几行)
for(i = iFilterMY; i < nHeight - iFilterH + iFilterMY + 1; i++)
{
// 列(除去边缘几列)
for(j = iFilterMX; j < nWidth - iFilterW + iFilterMX + 1; j++)
{
// 指向新DIB第i行,第j个象素的指针
lpDst = pImg + lLineBytes * (nHeight - 1 - i) + j;

// 读取滤波器数组
for (k = 0; k < iFilterH; k++)
{
for (l = 0; l < iFilterW; l++)
{
// 指向DIB第i - iFilterMY + k行,第j - iFilterMX + l个象素的指针
lpSrc = pImg1 + lLineBytes * (nHeight - 1 
- i + iFilterMY - k) + j - iFilterMX + l;

// 保存象素值
aValue[k * iFilterW + l] = *lpSrc;
}
}

// 获取中值
* lpDst = GetMedianNum(aValue iFilterH * iFilterW);
}
}

}

unsigned char GetMedianNum(int * bArray int iFilterLen)
{
int ij; // 循环变量
unsigned char bTemp;

// 用冒泡法对数组进行排序
for (j = 0; j < iFilterLen - 1; j ++)
{
for (i = 0; i < iFilterLen - j - 1; i ++)
{
if (bArray[i] > bArray[i + 1])
{
// 互换
bTemp = bArray[i];
bArray[i] = bArray[i + 1];
bArray[i + 1] = bTemp;
}
}
}

// 计算中值
if ((iFilterLen & 1) > 0)
{
// 数组有奇数个元素,返回中间一个元素
bTemp = bArray[(iFilterLen + 1) / 2];
}
else
{
// 数组有偶数个元素,返回中间两个元素平均值
bTemp = (bArray[iFilterLen / 2] + bArray[iFilterLen / 2 + 1]) / 2;
}

return bTemp;
}




评论

共有 条评论