最近用到好多小函数。
整理记录在此。
(参考网络资源,整理而来)
/*****************************************************
*
* 函数名称:
* MidFilter
*
* 参数:
* IplImage* img -需要进行种植滤波的函数
* int tem_w -模板的宽度
* int tem_h -模板的高度
* 返回:
* 返回处理后的图像
* 功能:
* 对图像进行中值滤波
*
* 说明:
* 为处理方便起见,模板的宽度和高度都应为奇数
*******************************************************/
IplImage* MidFilter(IplImage* img,int tem_w,int tem_h)
{
//统计中间值
double mid;
BYTE *temp=(BYTE*)malloc(tem_w*tem_h*sizeof(BYTE));
//如果图像不是256色返回
if (img->nChannels != 1)
{
//返回
return NULL;
}
//建立一个和原图像大小相同的25色灰度位图
IplImage *img_mid = cvCreateImage(cvGetSize(img), 8, 1);
//循环变量
int i,j,m,n;
int w, h, dw;
//对图像进行扫描
//行
for(i=0;i<h;i++)
{
//列
for(j=0;j<w;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) )
{
CvScalar s = cvGet2D(img, i, j);;
cvSet2D(img_mid, i, j, s);
}
//对于其他的象素进行模板操作
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)为中心,与模板大小相同的范围内的象素传递到模板矩阵中
CvScalar s1 = cvGet2D(img, m, n);
temp[(m-i+((tem_h-1)/2))*tem_w+n-j+((tem_w-1)/2)]= s1.val[0];
}
}
//利用气泡法计算中值
for(m=0;m<tem_w*tem_h-1;m++)
{
for(n=0;n<tem_w*tem_h-m-1;n++)
{
if(temp[n]>temp[n+1])
{
mid=temp[n];
temp[n]=temp[n+1];
temp[n+1]=mid;
}
}
}
//将计算的结果放到新的位图的相应位置
CvScalar s2;
s2.val[0] = temp[(tem_w*tem_h-1)/2];
cvSet2D(img_mid, i, j, s2);
}
}
}
return img_mid;
}