//模板为3 SIZE 为宏
int _tmain(int argc, _TCHAR* argv[])
{
IplImage*image=cvLoadImage("E:\\1.png",0);
//滤波器模板
int model[][SIZE]={{1,1,1},{1,1,1},{1,1,1}};
//创建动态二维数组 填充数据,在原数据顶部和底部,左侧和右侧分别填充
uchar ** data1=new uchar*[image->height+2];
for(int i=0; i<image->height+2;i++)
data1[i]=new uchar[image->width+2];
cvShowImage("image",image);
IplImage *dest=point_Detection(image,data1);
IplImage *dest_medium= medium(image);
cvShowImage("dest",dest);
cvShowImage("medium",dest_medium);
cvWaitKey(0);
/*
sizeof(model[0]):第二维所占的字节数
sizeof(model):第一维所占字节数
sizeof(int):单个元素所占字节数
*/
//释放动态分配的二维数组
for (int i=0;i<image->height+2;i++)
{
delete data1[i];
data1[i]=NULL;
}
delete data1;
data1=NULL;
return 0;
}
//中值滤波处理
IplImage * medium(IplImage *src){
uchar*data=(uchar*)src->imageData;
IplImage *dest=cvCreateImage(cvSize(src->width,src->height),src->depth,src->nChannels);//平滑后的图像
uchar*dest_data=(uchar*)dest->imageData;
memcpy(dest_data,data,src->width*src->height*sizeof(uchar));
for(int i=1;i<dest->height-1;i++)
for(int j=1;j<dest->width-1;j++){
uchar window[SIZE*SIZE];
int k=0;
for(int ii=i-1;ii<i+2;++ii)
for(int jj=j-1;jj<j+2;++jj)
window[k++]=data[ii*src->widthStep+jj];
//选择排序
for(int m=0;m<SIZE*SIZE-1;m++){
int kk=m;
for(int n=m+1;n<SIZE*SIZE;n++)
if(window[n]>window[kk])
kk=n;
if(kk!=m)
{
int t=window[m];
window[m]=window[kk];
window[kk]=t;
}
}
dest_data[i*dest->widthStep+j]=window[SIZE*SIZE/2];
}
return dest;
}
//均值滤波
IplImage* point_Detection(IplImage *src,uchar**data1,int model[][SIZE]){
uchar *data = (uchar*)src->imageData;
IplImage *dest=cvCreateImage(cvSize(src->width,src->height),src->depth,src->nChannels);//平滑后的图像
uchar*dest_data=(uchar*)dest->imageData;
//为填充的边界赋值
for(int i=0;i<src->height+2;i++){
data1[i][0]=0;
data1[i][1]=0;
data1[i][src->width]=0;
data1[i][src->width+1]=0;
for(int j=0;j<src->width+2;j++){
data1[0][j]=0;
data1[1][j]=0;
data1[src->height][j]=0;
data1[src->height+1][j]=0;
}
}
for(int i=0;i<src->height;i++)
for(int j=0;j<src->width;j++)
data1[i+1][j+1]=data[i*src->widthStep+j];
int max1 = 0;//图像中最大灰度 孤点检测时
for (int i=0;i<src->height;i++)
for(int j=0;j<src->width;j++)
if (*(data+i*src->widthStep+j)>max1)
max1=data[i*src->widthStep+j];
//平滑处理 均值滤波
int s=0;//模板系数和
for(int x=0;x<SIZE;x++)
for(int y=0;y<SIZE;y++)
s+=model[x][y];
for (int i=0;i<src->height;i++)
for (int j=0;j<src->width;j++)
{
int t=0;
for(int x=0;x<SIZE;x++)
for(int y=0;y<SIZE;y++){
t+=data1[i+x][j+y]*model[x][y];
}
t/=s;
dest_data[i*src->widthStep+j]=t;
}
/*
//未填充,直接对原图像进行均值滤波处理
for (int i=0;i<src->height-1;i++){
for(int j=0;j<src->width-1;j++){
int t =0;
for(int x= -size/2;x<=size/2;x++)
for(int y=-size/2;y<=size/2;y++)
if (i+x>=0&&y+j>=0)
t+=data[(x+i)*src->widthStep+j+y]*model[x+1][y+1];
//实现均值滤波
t= t/s;
dest_data[i*src->widthStep+j]=t;
//t /=(size*size);
//实现孤立点检测
//if (abs(t)>=max1*0.9)
// dest_data[i*widestep+j]=255;
//else
// dest_data[i*widestep+j]=0;
}
}*/
return dest;
}
原图
均值滤波
中值滤波