均值、中值滤波、孤点检测

//模板为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;

}

 

原图

均值滤波

中值滤波

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值