资源描述
实验2.3中值滤波
一、 实验代码
# include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "cv.h"
#include "highgui.h"
#define U 20 //高斯分布的均值
#define D 30 //高斯分布的均方差
int Gaus_S(){ //产生高斯样本,以U为均值,D为均方差
double sum=0;
for(int i=0;i<12;i++)
sum+=rand()/32767.00;
//计算机中rand()函数为-32767~+32767(2^15-1)
//故sum+为0~1之间的均匀随机变量
return int(U+D*(sum-6));
//产生均值为U,标准差为D的高斯分布的样本,并返回
}
int main()
{
IplImage* img,* imge,* imgA,*imgg,*imggg;
int i,j,sum,k;
int height,width,step,channel;
uchar * data, * daat, * dd, * junzhi,*zhongzhi;
CvSize czSize;
imgA=cvLoadImage("D:\\123.jpg",0);//灰度图
height=imgA->height; //图像信息
width=imgA->width;
step=imgA->widthStep;
channel=imgA->nChannels; //图像信息 nChannels是图像通道,黑白1通道,彩色3通道
data=(uchar*)imgA->imageData;//像素
img= cvCreateImage(cvSize(imgA->width,imgA->height), imgA->depth, imgA->nChannels);
dd=(uchar*)img->imageData;
imgg= cvCreateImage(cvSize(imgA->width,imgA->height), imgA->depth, imgA->nChannels);
junzhi=(uchar*)imgg->imageData;
imggg= cvCreateImage(cvSize(imgA->width,imgA->height), imgA->depth, imgA->nChannels);
zhongzhi=(uchar*)imggg->imageData;
srand((unsigned)time(NULL)); //种下随机种子
//产生高斯噪声
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
for(int k=0;k<=channel-1;k++)
{
dd[i*step+j*channel+k]=data[i*step+j*channel+k]+Gaus_S();
}
}
}
//中值滤波
int a[9],temp,p;
for( i = 0 ; i < height;i++){
for( j = 0; j<width;j++){
//边界处理
if(i == 0 || i == height || j == 0 || j == width){
for(int k=0;k<channel-1;k++)
zhongzhi[i*step+j*channel+k] =dd[i*step+j*channel+k];
}
else {
for(int k=0;k<=channel-1;k++){
a[0]= dd[(i-1)*step+(j-1)*channel+k];
a[1]= dd[(i-1)*step+j*channel+k];
a[2]= dd[(i-1)*step+(j+1)*channel+k];
a[3]= dd[i*step+(j-1)*channel+k];
a[4]= dd[i*step+j*channel+k];
a[5]= dd[i*step+(j+1)*channel+k];
a[6]= dd[(i+1)*step+(j-1)*channel+k];
a[7]= dd[(i+1)*step+j*channel+k];
a[8]= dd[(i+1)*step+(j+1)*channel+k];
//选择排序
for(k=0;k<9;k++)
{
p=k;
for(int l=k;l<9;l++)
{
if(a[l]<a[p])
p=l;
}
temp=a[k];
a[k]=a[p];
a[p]=temp;
}
//取中值
zhongzhi[i*step+j*channel+k] =a[4];
}
}
}
}
cvNamedWindow("灰度图",1);
cvShowImage("灰度图",imgA);
cvNamedWindow("高斯噪声图",1);
cvShowImage("高斯噪声图",img);
cvNamedWindow("中值滤波",1);
cvShowImage("中值滤波",imggg);
cvWaitKey(0);
return 0;
}
展开阅读全文