当前位置:文档之家› 椒盐噪声和中值滤波

椒盐噪声和中值滤波

Salt-and-pepper noise1.产生椒盐噪声在图像中随机选取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);//默认窗口大小为*3cvNamedWindow("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');%%functionfunction d = media_filter(image,m)n=m;[height,width]=size(image);x1 = double(image);x2 = x1;for i=1:height-n+1for j=1:width-n+1A = 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);endendd = uint8(x2);5.MATLAB中值滤波结果及结论:中值滤波是图像处理中的一个常用步骤,它对于斑点噪声和椒盐噪声来说尤其有用。

中值滤波方法以牺牲图像清晰度为代价消除图像中的椒盐噪声。

同时,中值滤波不能多次使用,因为这样会使图像各个像素间趋于相同,整个图像就会变得越来越模糊。

7x7 11x11 2次11x11GaussNoise1.利用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+1for j=1:width-n+1c = 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);%将与模板运算后的各元素的均值赋给模板中心位置的元素endend%未被赋值的元素取原值d = uint8(x2);3.结论:可见均值滤波在一定程度上能够减弱高斯噪声对图像的影响,但是并不能够完全消除而且随着模板矩阵阶数增大虽然滤波效果更好,但是图像会变模糊。

相关主题