资源描述
王柯
Salt-and-pepper noise
1. 产生椒盐噪声
在图像中随机选取6000个点,3000设为白色,3000个设为黑色,产生椒盐噪声
%----------------------------------------------------------------------------------------------------------------------------%
%----------------------------------------------------------------------------------------------------------------------------%
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <cv.h>
void salt(cv::Mat &image,int n)
{
for(int k=0;k<n;k++)
{
int i=rand()%image.cols;
int j=rand()%image.rows;
if(image.channels()==1)
{
image.at<uchar>(j,i)=255;
}else if (image.channels() == 3) {
image.at<cv::Vec3b>(j,i)[0]= 255;
image.at<cv::Vec3b>(j,i)[1]= 255;
image.at<cv::Vec3b>(j,i)[2]= 255;
}
}//产生3000个白点
for(int k=0;k<n;k++)
{
int i=rand()%image.cols;
int j=rand()%image.rows;
if(image.channels()==1)
{
image.at<uchar>(j,i)=0;
}else if (image.channels() == 3) {
image.at<cv::Vec3b>(j,i)[0]= 0;
image.at<cv::Vec3b>(j,i)[1]= 0;
image.at<cv::Vec3b>(j,i)[2]= 0;
}
}
}//产生3000个黑点
int main()
{
cv::Mat image;
image = cv::imread("lena.jpg");
salt(image,3000);
cv::namedWindow("WK");
cv::imshow("WK",image);
cv::waitKey(0);
return 1;
}
%----------------------------------------------------------------------------------------------------------------------------%
%----------------------------------------------------------------------------------------------------------------------------%
2. 中值滤波
利用opencv中的cvSmooth对图像进行中值滤波。
%----------------------------------------------------------------------------------------------------------------------------%
%----------------------------------------------------------------------------------------------------------------------------%
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <cv.h>
int main(){
IplImage * image = cvLoadImage("wks.jpg");
//cvNamedWindow("before");
//cvShowImage("before",image);
IplImage * im_gray = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 1);
cvCvtColor(image, im_gray, CV_BGR2GRAY);
cvNamedWindow("Gray");
cvShowImage("Gray",im_gray);
cvSaveImage("im_gray.jpg",im_gray);
IplImage * im_median_filter = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 1);
cvSmooth(im_gray, im_median_filter, CV_MEDIAN);//默认窗口大小为*3
cvNamedWindow("after");
cvShowImage("after",im_median_filter);
//cvSaveImage("im_median.jpg",im_median_filter);
cv::waitKey(0);
return 1;}
%----------------------------------------------------------------------------------------------------------------------------%
%----------------------------------------------------------------------------------------------------------------------------%
处理前的灰度图像: 处理后的灰度图像:
原始灰度图像:
3.结论:
可以看出中值滤波能够较好的恢复有椒盐噪声的图像
4.Matlab中值滤波:
clear;
clc;
image = imread('gray.jpg');
result= media_filter(image,7);
imshow(result);
imwrite(result,'media_filter.jpg');
%%function
function d = media_filter(image,m)
n=m;
[height,width]=size(image);
x1 = double(image);
x2 = x1;
for i=1:height-n+1
for j=1:width-n+1
A = x1(i:(i+n-1),j:(j+n-1));
B = sort(A);
C = sort(B);
x2(i+(n-1)/2,j+(n-1)/2) = C((n+1)/2,(n+1)/2);
end
end
d = uint8(x2);
5.MATLAB中值滤波结果及结论:
中值滤波是图像处理中的一个常用步骤,它对于斑点噪声和椒盐噪声来说尤其有用。中值滤波方法以牺牲图像清晰度为代价消除图像中的椒盐噪声。同时,中值滤波不能多次使用,因为这样会使图像各个像素间趋于相同,整个图像就会变得越来越模糊。
7x7 11x11 2次11x11
GaussNoise
1.利用MATLAB向原始灰度图像中添加高斯噪声
%%
clear;
clc;
image = imread('origin.jpg');
noise = imnoise(image,'gaussian');% 添加均值为0,方差为0.01的高斯白噪声
imshow(noise);
title('gaussian noise')
%%
2.利用均值滤波
clear;
clc;
image = imread('gaussnoise.jpg');
result = avg_filter(image,11);
imshow(result);
imwrite(result,'use11x11.jpg')
function d=avg_filter(x,n)
%x为待处理的图像,n为模板大小
a(1:n,1:n)=1;
[height,width]=size(x);
x1=double(x);
x2=x1;
for i=1:height-n+1
for j=1:width-n+1
c = x1(i:(i+n-1),j:(j+n-1)).*a;%取出x1中从(i,j)开始的n行n列元素与模板相乘
s=sum(sum(c));
x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n);%将与模板运算后的各元素的均值赋给模板中心位置的元素
end
end
%未被赋值的元素取原值
d = uint8(x2);
3.结论:
可见均值滤波在一定程度上能够减弱高斯噪声对图像的影响,但是并不能够完全消除而且随着模板矩阵阶数增大虽然滤波效果更好,但是图像会变模糊。
展开阅读全文