您的位置:首页 > 运维架构

图像去噪的OPenCV添加噪声和去噪

2016-07-18 09:26 381 查看

添加噪声

添加高斯噪声

IplImage* AddGuassianNoise(IplImage* src)    //添加高斯噪声
{
IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
IplImage* noise = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
CvRNG rng = cvRNG(-1);
cvRandArr(&rng,noise,CV_RAND_NORMAL,cvScalarAll(0),cvScalarAll(25));
cvAdd(src,noise,dst);
return dst;
}


添加椒盐噪声

IplImage* AddPepperSaltNoise(IplImage* src)    //添加椒盐噪声,随机黑白点
{
IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
cvCopy(src, dst);
for(int k=0; k<(src->height*src->width*P); k++)
{
int i = rand()%src->height;
int j = rand()%src->width;
int m = rand()%2;
CvScalar s = cvGet2D(src, i, j);
if(src->nChannels == 1)
{
if(m==0)
{
s.val[0] = 255;
}
else
{
s.val[0] = 0;
}
}
else if(src->nChannels==3)
{
if(m==0)
{
s.val[0]=255;
s.val[1]=255;
s.val[2]=255;
}
else
{
s.val[0]=0;
s.val[1]=0;
s.val[2]=0;
}
}
cvSet2D(dst, i, j, s);
}
return dst;
}


实现滤波器

1、 算术均值滤波器

//算术均值滤波器——模板大小5*5
IplImage* ArithmeticMeanFilter(IplImage* src)
{
IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
cvSmooth(src,dst,CV_BLUR,5);
return dst;
}


2、 几何均值滤波器

//几何均值滤波器——模板大小5*5
IplImage* GeometryMeanFilter(IplImage* src)
{
IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
int row, col;
int h=src->height;
int w=src->width;
double mul[3];
double dc[3];
int mn;
//计算每个像素的去噪后color值
for(int i=0;i<src->height;i++){
for(int j=0;j<src->width;j++){
mul[0]=1.0;
mn=0;
//统计邻域内的几何平均值,邻域大小5*5
for(int m=-2;m<=2;m++){
row = i+m;
for(int n=-2;n<=2;n++){
col = j+n;
if(row>=0&&row<h && col>=0 && col<w){
CvScalar s = cvGet2D(src, row, col);
mul[0] = mul[0]*(s.val[0]==0?1:s.val[0]);   //邻域内的非零像素点相乘
mn++;
}
}
}
//计算1/mn次方
CvScalar d;
dc[0] = pow(mul[0], 1.0/mn);
d.val[0]=dc[0];
//统计成功赋给去噪后图像。
cvSet2D(dst, i, j, d);
}
}
return dst;
}


3、谐波均值滤波器

//谐波均值滤波器——模板大小5*5
IplImage* HarmonicMeanFilter(IplImage* src)
{
IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
int row, col;
int h=src->height;
int w=src->width;
double sum[3];
double dc[3];
int mn;
//计算每个像素的去噪后color值
for(int i=0;i<src->height;i++){
for(int j=0;j<src->width;j++){
sum[0]=0.0;
mn=0;
//统计邻域,5*5模板
for(int m=-2;m<=2;m++){
row = i+m;
for(int n=-2;n<=2;n++){
col = j+n;
if(row>=0 && row<h && col>=0 && col<w){
CvScalar s = cvGet2D(src, row, col);
sum[0] = sum[0]+(s.val[0]==0?255:255/s.val[0]);
mn++;
}
}
}
CvScalar d;
dc[0] = mn*255/sum[0];
d.val[0]=dc[0];
//统计成功赋给去噪后图像。
cvSet2D(dst, i, j, d);
}
}
return dst;
}


4、逆谐波均值滤波器

//逆谐波均值大小滤波器——模板大小5*5
IplImage* InverseHarmonicMeanFilter(IplImage* src)
{
IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
//cvSmooth(src,dst,CV_BLUR,5);
int row, col;
int h=src->height;
int w=src->width;
double sum[3];
double sum1[3];
double dc[3];
double Q=2;
//计算每个像素的去噪后color值
for(int i=0;i<src->height;i++){
for(int j=0;j<src->width;j++){
sum[0]=0.0;
sum1[0]=0.0;
//统计邻域
for(int m=-2;m<=2;m++){
row = i+m;
for(int n=-2;n<=2;n++){
col = j+n;
if(row>=0&&row<h && col>=0 && col<w){
CvScalar s = cvGet2D(src, row, col);
sum[0] = sum[0]+pow(s.val[0]/255, Q+1);
sum1[0] = sum1[0]+pow(s.val[0]/255, Q);
}
}
}
//计算1/mn次方
CvScalar d;
dc[0] = (sum1[0]==0?0:(sum[0]/sum1[0]))*255;
d.val[0]=dc[0];
//统计成功赋给去噪后图像。
cvSet2D(dst, i, j, d);
}
}
return dst;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv 去噪