精华内容
下载资源
问答
  • 采用算数均值滤波器,几何均值滤波器,中值滤波,自适应滤波器对图像进行滤波操作,并输出图像。 首先放一下结果: (1)算术均值滤波器 计算子窗口的并求平均 程序中对图像边缘不处理。右图为加入椒盐噪声,...

    采用算数均值滤波器,几何均值滤波器,中值滤波,自适应滤波器对图像进行滤波操作,并输出图像。
    首先放一下结果:
    在这里插入图片描述
    (1)算术均值滤波器
    计算子窗口的和并求平均
    在这里插入图片描述
    程序中对图像边缘不处理。右图为加入椒盐噪声,左图为算数均值滤波图像。

    在这里插入图片描述在这里插入图片描述
    程序实现:

    //算数均值滤波
    void CImageRecoveryDlg::ArithAverFilter( Mat &src, Mat &dst) {
    	if (src.channels() == 3)//彩色图像
    	{
    		for (int i = 1; i < src.rows; ++i) {
    			for (int j = 1; j < src.cols; ++j) {
    				if ((i - 1 >= 0) && (j - 1) >= 0 && (i + 1) < src.rows && (j + 1) < src.cols) {//边缘不进行处理
    					dst.at<Vec3b>(i, j)[0] = (src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i - 1, j - 1)[0] + src.at<Vec3b>(i - 1, j)[0] + src.at<Vec3b>(i, j - 1)[0] +
    						src.at<Vec3b>(i - 1, j + 1)[0] + src.at<Vec3b>(i + 1, j - 1)[0] + src.at<Vec3b>(i + 1, j + 1)[0] + src.at<Vec3b>(i, j + 1)[0] +
    						src.at<Vec3b>(i + 1, j)[0]) / 9;
    					dst.at<Vec3b>(i, j)[1] = (src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i - 1, j - 1)[1] + src.at<Vec3b>(i - 1, j)[1] + src.at<Vec3b>(i, j - 1)[1] +
    						src.at<Vec3b>(i - 1, j + 1)[1] + src.at<Vec3b>(i + 1, j - 1)[1] + src.at<Vec3b>(i + 1, j + 1)[1] + src.at<Vec3b>(i, j + 1)[1] +
    						src.at<Vec3b>(i + 1, j)[1]) / 9;
    					dst.at<Vec3b>(i, j)[2] = (src.at<Vec3b>(i, j)[2] + src.at<Vec3b>(i - 1, j - 1)[2] + src.at<Vec3b>(i - 1, j)[2] + src.at<Vec3b>(i, j - 1)[2] +
    						src.at<Vec3b>(i - 1, j + 1)[2] + src.at<Vec3b>(i + 1, j - 1)[2] + src.at<Vec3b>(i + 1, j + 1)[2] + src.at<Vec3b>(i, j + 1)[2] +
    						src.at<Vec3b>(i + 1, j)[2]) / 9;
    				}
    				else {//边缘赋值
    					dst.at<Vec3b>(i, j)[0] = src.at<Vec3b>(i, j)[0];
    					dst.at<Vec3b>(i, j)[1] = src.at<Vec3b>(i, j)[1];
    					dst.at<Vec3b>(i, j)[2] = src.at<Vec3b>(i, j)[2];
    				}
    			}
    		}
    	}
    	if (src.channels() == 1) {//灰度图像
    		for (int i = 0; i < src.rows; i++) {
    			for (int j = 0; j < src.cols; j++) {
    				if ((i - 1 >= 0) && (j - 1) >= 0 && (i + 1) < src.rows && (j + 1) < src.cols) {//边缘不进行处理
    					dst.at<uchar>(i, j) = (src.at<uchar>(i, j) + src.at<uchar>(i - 1, j - 1) + src.at<uchar>(i - 1, j) + src.at<uchar>(i, j - 1) +
    						src.at<uchar>(i - 1, j + 1) + src.at<uchar>(i + 1, j - 1) + src.at<uchar>(i + 1, j + 1) + src.at<uchar>(i, j + 1) +
    						src.at<uchar>(i + 1, j)) / 9;
    				}
    				else {//边缘赋值
    					dst.at<uchar>(i, j) = src.at<uchar>(i, j);
    				}
    			}
    		}
    	}
    	imshow("arithAverFilter", dst);
    }
    

    (2)几何均值滤波
    对子窗口的元素相乘(需要判断是否为零),并对乘积求1/m*n次幂。
    在这里插入图片描述
    程序中需要判断窗口中的元素是否为0,如果为0则去除该元素。
    右图为加入椒盐噪声的图像,左图为几何均值滤波后图像。
    在这里插入图片描述在这里插入图片描述
    程序实现:

    //几何均值滤波
    void CImageRecoveryDlg::GeoAverFliter(const Mat &src, Mat &dst) {
    	Mat _dst(src.size(), CV_32FC1);
    	double power = 1.0 / 9;
    	cout << "power:" << power << endl;
    	double geo = 1;
    	if (src.channels() == 1) {
    		for (int i = 0; i < src.rows; i++) {
    			for (int j = 0; j < src.cols; j++) {
    				if ((i - 1) > 0 && (i + 1) < src.rows && (j - 1) > 0 && (j + 1) < src.cols) {
    					if (src.at<uchar>(i, j) != 0) geo = geo * src.at<uchar>(i, j);
    					if (src.at<uchar>(i+1, j+1) != 0) geo = geo * src.at<uchar>(i+1, j+1);
    					if (src.at<uchar>(i+1, j) != 0) geo = geo * src.at<uchar>(i+1, j);
    					if (src.at<uchar>(i, j+1) != 0) geo = geo * src.at<uchar>(i, j+1);
    					if (src.at<uchar>(i+1, j-1) != 0) geo = geo * src.at<uchar>(i+1, j-1);
    					if (src.at<uchar>(i-1, j+1) != 0) geo = geo * src.at<uchar>(i-1, j+1);
    					if (src.at<uchar>(i-1, j) != 0) geo = geo * src.at<uchar>(i-1, j);
    					if (src.at<uchar>(i, j-1) != 0) geo = geo * src.at<uchar>(i, j-1);
    					if (src.at<uchar>(i-1, j-1) != 0) geo = geo * src.at<uchar>(i-1, j-1);					
    					/*geo = src.at<uchar>(i, j)* src.at<uchar>(i + 1, j + 1)* src.at<uchar>(i + 1, j)* src.at<uchar>(i, j + 1)*
    						src.at<uchar>(i + 1, j - 1)* src.at<uchar>(i - 1, j + 1)* src.at<uchar>(i - 1, j)*
    						src.at<uchar>(i, j - 1)* src.at<uchar>(i - 1, j - 1);*/
    					_dst.at<float>(i, j)= pow(geo, power);
    					geo = 1;
    					//if (i % 10 == 0&&j%10==0)
    						//printf("_dst.at<float>(%d, %d)=%f\n", i, j, _dst.at<float>(i, j));
    					
    
    				}
    				else
    					_dst.at<float>(i, j) = src.at<uchar>(i, j);
    			}
    		}
    	}
    	_dst.convertTo(dst, CV_8UC1);
    
    	//_dst.copyTo(dst);//拷贝
    	imshow("geoAverFilter", dst);
    
    }
    

    (3)中值滤波
    找出子窗口中的中值,将其赋值给中心点。
    在这里插入图片描述
    程序中Median为寻找中值的函数,参数为子窗口的元素值。
    左图为加入椒盐噪声的图像,右图为中值滤波的图像。

    在这里插入图片描述在这里插入图片描述
    可以看出中值滤波对椒盐噪声有很好的滤波效果。
    程序实现:

    //返回中值
    uchar Median(uchar n1, uchar n2, uchar n3, uchar n4, uchar n5,
    	uchar n6, uchar n7, uchar n8, uchar n9) {
    	uchar arr[9];
    	arr[0] = n1;
    	arr[1] = n2;
    	arr[2] = n3;
    	arr[3] = n4;
    	arr[4] = n5;
    	arr[5] = n6;
    	arr[6] = n7;
    	arr[7] = n8;
    	arr[8] = n9;
    	for (int gap = 9 / 2; gap > 0; gap /= 2)//希尔排序
    		for (int i = gap; i < 9; ++i)
    			for (int j = i - gap; j >= 0 && arr[j] > arr[j + gap]; j -= gap)
    				swap(arr[j], arr[j + gap]);
    	return arr[4];//返回中值
    }
    //中值滤波
    void CImageRecoveryDlg::MedianFliter(const Mat &src, Mat &dst) {
    	if (!src.data)return;
    	Mat _dst(src.size(), src.type());
    	if (src.channels() == 3) {
    		for (int i = 0; i < src.rows; ++i) {
    			for (int j = 0; j < src.cols; ++j) {
    				if ((i - 1) > 0 && (i + 1) < src.rows && (j - 1) > 0 && (j + 1) < src.cols) {
    					_dst.at<Vec3b>(i, j)[0] = Median(src.at<Vec3b>(i, j)[0], src.at<Vec3b>(i + 1, j + 1)[0],
    						src.at<Vec3b>(i + 1, j)[0], src.at<Vec3b>(i, j + 1)[0], src.at<Vec3b>(i + 1, j - 1)[0],
    						src.at<Vec3b>(i - 1, j + 1)[0], src.at<Vec3b>(i - 1, j)[0], src.at<Vec3b>(i, j - 1)[0],
    						src.at<Vec3b>(i - 1, j - 1)[0]);
    					_dst.at<Vec3b>(i, j)[1] = Median(src.at<Vec3b>(i, j)[1], src.at<Vec3b>(i + 1, j + 1)[1],
    						src.at<Vec3b>(i + 1, j)[1], src.at<Vec3b>(i, j + 1)[1], src.at<Vec3b>(i + 1, j - 1)[1],
    						src.at<Vec3b>(i - 1, j + 1)[1], src.at<Vec3b>(i - 1, j)[1], src.at<Vec3b>(i, j - 1)[1],
    						src.at<Vec3b>(i - 1, j - 1)[1]);
    					_dst.at<Vec3b>(i, j)[2] = Median(src.at<Vec3b>(i, j)[2], src.at<Vec3b>(i + 1, j + 1)[2],
    						src.at<Vec3b>(i + 1, j)[2], src.at<Vec3b>(i, j + 1)[2], src.at<Vec3b>(i + 1, j - 1)[2],
    						src.at<Vec3b>(i - 1, j + 1)[2], src.at<Vec3b>(i - 1, j)[2], src.at<Vec3b>(i, j - 1)[2],
    						src.at<Vec3b>(i - 1, j - 1)[2]);
    				}
    				else
    					_dst.at<Vec3b>(i, j) = src.at<Vec3b>(i, j);
    			}
    		}
    	}
    	if (src.channels() == 1) {
    		for (int i = 0; i < src.rows; ++i) {
    			for (int j = 0; j < src.cols; ++j) {
    				if ((i - 1) > 0 && (i + 1) < src.rows && (j - 1) > 0 && (j + 1) < src.cols) {
    					_dst.at<uchar>(i, j) = Median(src.at<uchar>(i, j), src.at<uchar>(i + 1, j + 1),
    						src.at<uchar>(i + 1, j), src.at<uchar>(i, j + 1), src.at<uchar>(i + 1, j - 1),
    						src.at<uchar>(i - 1, j + 1), src.at<uchar>(i - 1, j), src.at<uchar>(i, j - 1),
    						src.at<uchar>(i - 1, j - 1));
    		
    				}
    				else
    					_dst.at<uchar>(i, j) = src.at<uchar>(i, j);
    			}
    		}
    	}
    	_dst.copyTo(dst);//拷贝
    	imshow("mediaFilter", dst);
    }
    

    (4)自适应滤波
    Zmin=Sxy中的最小灰度值;
    Zmax=Sxy中的最大灰度值;
    Zmed=Sxy中的中值;
    Zxy=坐标(x,y)处的灰度值;
    Smax=Sxy所允许的最大尺寸(在程序中,用kernal_size表示);
    左图为加入椒盐噪声的图像,右图为自适应滤波的图像。
    在这里插入图片描述在这里插入图片描述
    可以看出自适应滤波效果最好,但计算时间比中值滤波长很多,有很长的时延。
    程序实现:

    #define CV_ROI_ELEM(src,vector,m,n,ks)  \
    {                                      \
        uchar* kn;                         \
        int st0=src.step[0];\
        int st1=src.step[1];\
        for(int k=0;k<(ks);k++)            \
        {                                  \
            for(int s=0;s<(ks);s++)        \
            {                              \
                kn =src.data+(k+m)*st0+(s+n)*st1;   \
                vector.push_back(*kn);              \
            }                                       \
        }                                           \
    }
    
    #define CV_MAT_ELEM2(src,dtype,y,x) \
        (dtype*)(src.data+src.step[0]*(y)+src.step[1]*(x))
    //自适应滤波
    void selfAdaptiveFilter(Mat&src, Mat&dst, int kernal_size)
    {
    	CV_Assert(src.type() == CV_8UC1 || src.type() == CV_8U);
    	if (dst.empty())
    	{
    		dst.create(src.rows, src.cols, CV_8UC1);
    	}
    	uchar* pdst = dst.data;
    	uchar Zmin, Zmax, Zmed, Zxy;
    	int step0 = src.step[0];
    	int step1 = src.step[1];
    	for (int i = kernal_size / 2; i < src.rows - kernal_size / 2; i++)
    	{
    		for (int j = kernal_size / 2; j < src.cols - kernal_size / 2; j++)
    		{
    			int ks = 3;//kernal_size;
    			int count = 0;
    			Zxy = *CV_MAT_ELEM2(src, uchar, i, j);//Sxy覆盖区域的中心点像素值,即锚点像素值
    			vector<uchar> v;//将模板覆盖区域的像素,压入矢量v中
    			do {
    				if (count == 0)
    				{//获取模板ks*ks覆盖区域的像素,压入矢量v中
    					CV_ROI_ELEM(src, v, i - ks / 2, j - ks / 2, ks);
    				}
    				else
    				{
    					/****************下面的for循环,将外扩的四个边的像素添加到v中**************/
    					uchar* p = src.data + (i - ks / 2)*step0 + (j - ks / 2)*step1;
    					for (int u = 0; u < ks; u++)
    					{
    						v.push_back(*(p + u * step1));//向外扩展的四个边的上边
    						v.push_back(*(p + (ks - 1)*step0 + u * step1));//向外扩展的四个边的下边
    						if (u != 0 && u != ks - 1)
    						{
    							v.push_back(*(p + u * step0));//向外扩展的四个边的左边
    							v.push_back(*(p + u * step0 + (ks - 1)*step1));//向外扩展的四个边的右边
    						}
    					}
    				}
    
    				//对v的元素排序
    				//排序后,Sxy覆盖区域内,最大值为Zmax=v[v.size-1],最小值为Zmin=v[0]
    				std::sort(v.begin(), v.end());
    				Zmin = v[0], Zmax = v[v.size() - 1], Zmed = v[ks*ks / 2];
    				pdst = CV_MAT_ELEM2(dst, uchar, i, j);
    				if (Zmin < Zmed&&Zmed < Zmax)
    				{
    					if (Zmin < Zxy&&Zxy < Zmax)
    					{
    						*pdst = Zxy; break;
    					}
    					else
    					{
    						*pdst = Zmed; break;
    					}
    				}
    				else
    				{
    					ks += 2;
    				}
    				count++;
    			} while (ks <= kernal_size);
    
    			*pdst = Zmed;
    		}
    	}
    	imshow("selfAdaptiveFilter", dst);
    }
    
    

    (5)整体比较
    算数均值滤波在去除椒盐噪声的同时,图像也变得模糊。
    几何均值滤波去除噪声同时,相对于算数均值滤波锐化。
    中值滤波相比于前两者效果最好,去除了噪声,且图像损失较小。
    自适应滤波是四者中效果最好的,但是计算复杂,有很大的延迟。
    在这里插入图片描述
    程序为MFC对话框程序,对话框程序如下:

    //显示图像
    void CImageRecoveryDlg::showMat(Mat &image, int i, String name) {
    	CRect pic_rect;
    	int width, height;
    	//CWnd  *pWnd = GetDlgItem(i);
    	GetDlgItem(i)->GetClientRect(&pic_rect);
    	width = pic_rect.right;
    	height = pic_rect.bottom;
    	resize(image, image, Size(width, height));
    	imshow(name, image);
    }
    //打开图像按钮
    void CImageRecoveryDlg::OnBnClickedOpenBtn()
    {
    
    	CFileDialog fileDlg(true, _T("png"), NULL, 0, _T("image Files(*.bmp; *.jpg;*.png;*.tif)|*.JPG;*.PNG;*.BMP;*.TIF|All Files (*.*) |*.*||"), this);
    	fileDlg.DoModal();
    	//获取图片路径和图片名称
    	strFilePath = fileDlg.GetPathName();
    	strFileName = fileDlg.GetFileName();
    	//判断路径不为空
    	if (strFilePath == _T(""))
    	{
    		return;
    	}
    
    	image.Load(strFilePath);
    	CImageToMat(image, src_Mat);
    
    	//cvtColor(src_Mat, gray_Mat, COLOR_BGR2GRAY);//将图像转换为灰度图像
    	imshow("src_image", src_Mat);
    	showImage(image, IDC_INPUT_PIC);//显示图像
    }
    
    //加入噪声函数
    void CImageRecoveryDlg::OnBnClickedNoiseBtn()
    {
    	Mat temp;
    	//salt_Mat = src_Mat.clone();
    	src_Mat.copyTo(salt_Mat);
    	salt(salt_Mat, 0.1);
    	temp = salt_Mat.clone();
    	showMat(temp, IDC_NOSIC_PIC, "salt_image");
    }
    
    //算数均值滤波
    void CImageRecoveryDlg::OnBnClickedCouBtn()
    {
    	Mat temp;
    	Mat ArithAver_Mat(salt_Mat.size(), salt_Mat.type());
    	cout << "salt_Mat.channels= " << salt_Mat.channels() << endl;//第一个元素值
    	ArithAverFilter(salt_Mat, ArithAver_Mat);
    	temp = ArithAver_Mat.clone();
    	showMat(temp, IDC_COU_MEAN, "arithAver_image");
    }
    
    //中值滤波按钮
    void CImageRecoveryDlg::OnBnClickedMediaBtn()
    {
    	Mat temp;
    	Mat MedianFilter_Mat(salt_Mat.size(), salt_Mat.type());
    	MedianFliter(salt_Mat, MedianFilter_Mat);
    	temp = MedianFilter_Mat.clone();
    	showMat(temp, IDC_MEDIA_FILTER, "medianFilter_image");
    }
    
    //几何均值滤波按钮
    void CImageRecoveryDlg::OnBnClickedGeoBtn()
    {
    	Mat temp;
    	Mat GeoAverFilter_Mat(salt_Mat.size(), salt_Mat.type());
    	GeoAverFliter(salt_Mat, GeoAverFilter_Mat);
    	temp = GeoAverFilter_Mat.clone();
    	showMat(temp, IDC_GEO_MEAN, "GeoAverFliter_image");
    }
    
    //自适应滤波按钮
    void CImageRecoveryDlg::OnBnClickedAdapteBtn()
    {
    	Mat temp;
    	Mat selfAdaptiveFilter_Mat(salt_Mat.size(), salt_Mat.type());
    	selfAdaptiveFilter(salt_Mat, selfAdaptiveFilter_Mat, 7);
    	temp = selfAdaptiveFilter_Mat.clone();
    	showMat(temp, IDC_ADAPT_FILTER, "selfAdaptiveFliter_image");
    }
    

    其中下列变量为全局变量

    #define	PI	3.141592
    CString strFilePath;
    CString strFileName;
    CImage image;
    Mat src_image, gray_image, src_Mat, gray_Mat;
    Mat salt_Mat,ArithAver_Mat;
    

    以上为四种滤波函数的对比。

    展开全文
  • 2、镜像填充在均值滤波中值滤波、高斯滤波中的应用: (1)先安装py-opencv库,接着导入opencv库,已安装过的不用重复安装。 导入cv2 计算需要填充的层数,注释的两行代码是实现零填充,零填充滤波后会有黑框,...

    三种滤波的零填充方式的代码实现,在我发布的其他博客中有详细步骤和介绍。本文只介绍关于镜像填充的简单应用
    1、关于padding:
    padding,即边缘填充,可以分为四类:零填充,常数填充,镜像填充,重复填充。
    2、镜像填充在均值滤波、中值滤波、高斯滤波中的应用:
    (1)先安装py-opencv库,接着导入opencv库,已安装过的不用重复安装。
    导入cv2
    在这里插入图片描述

    计算需要填充的层数,注释的两行代码是实现零填充,零填充滤波后会有黑框,最后一行代码实现镜像填充,可去除滤波后的黑框。详细的滤波实现代码请在发布的其他博客中查看,不在赘述。
    在这里插入图片描述

    展开全文
  • 均值滤波均值滤波,是图像处理中最常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高 频信号将会去掉,因此可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。理想的均 值滤波是用每个像素它...

    均值滤波:

    均值滤波,是图像处理中最常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高

    频信号将会去掉,因此可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。理想的均

    值滤波是用每个像素和它周围像素计算出来的平均值替换图像中每个像素。采样Kernel数

    据通常是3X3的矩阵,如下表示:

    从左到右从上到下计算图像中的每个像素,最终得到处理后的图像。均值滤波可以加上两个

    参数,即迭代次数,Kernel数据大小。一个相同的Kernel,但是多次迭代就会效果越来越好。

    同样,迭代次数相同,Kernel矩阵越大,均值滤波的效果就越明显。

     

    中值滤波

    中值滤波也是消除图像噪声最常见的手段之一,特别是消除椒盐噪声,中值滤波的效果要比

    均值滤波更好。中值滤波是跟均值滤波唯一不同是,不是用均值来替换中心每个像素,而是

    将周围像素和中心像素排序以后,取中值,一个3X3大小的中值滤波如下:

     

    最大最小值滤波

    最大最小值滤波是一种比较保守的图像处理手段,与中值滤波类似,首先要排序周围像素和

    中心像素值,然后将中心像素值与最小和最大像素值比较,如果比最小值小,则替换中心像

    素为最小值,如果中心像素比最大值大,则替换中心像素为最大值。一个Kernel矩阵为3X3的最大最小值滤波如下:

     

     

    scipy模拟中值滤波

    signal的medfilt()方法传入两个参数,第一个参数是要作中值滤波的信号,第二个参数是邻域的大小(奇数)。如邻域为3即是每个点自己和左右各一个点成为一个邻域。在每个位置的邻域中选取中位数替换这个位置的数,也就是该函数的返回值数组。如果邻域中出现没有元素的位置,那么以0补齐。

    >>> x=np.random.randint(1,1000,(4,4))
    >>> x
    array([[ 31,  33, 745, 483],
           [331, 469, 804, 479],
           [235, 487, 244, 982],
           [857, 114, 167, 174]])
    >>> signal.medfilt(x,(3,3)) #二维中值滤波
    array([[   0.,   33.,  469.,    0.],
           [  33.,  331.,  483.,  479.],
           [ 235.,  331.,  469.,  174.],
           [   0.,  167.,  167.,    0.]])

     

    展开全文
  • 均值滤波详细的计算方法如下图所示: 其中55的矩阵称为核,针对原始图像内的像素点,采用核进行处理,得到结果图像,如下图所示: 提取1/25可以将核转换为如下形式: 3 中值滤波 在使用邻域...

    一、简介

    均值滤波是指任意一点的像素值,都是周围 N \times M 个像素值的均值。例如下图中,红色点的像素值是其周围蓝色背景区域像素值之和除25,25=5\times5 是蓝色区域的大小。

     

    均值滤波详细的计算方法如下图所示:

     

    其中5\times5的矩阵称为,针对原始图像内的像素点,采用核进行处理,得到结果图像,如下图所示:

     

     

    提取 1/25 可以将核转换为如下形式:

     

     

    3 中值滤波

    在使用邻域平均法去噪的同时也使得边界变得模糊。而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。计算过程如下图所示:

     

    4 高斯滤波

    为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等。

    图像高斯平滑也是邻域平均的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予了不同的权重。高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值,下图的所示的 3\times3 和 5\times5 邻域的高斯模板。

    (1)核大小为 3\times3

                                                                     \frac{1}{16}\times \left[ \begin{matrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \\ \end{matrix} \right]=\left[ \begin{matrix} {}^{1}\!\!\diagup\!\!{}_{16}\; & {}^{1}\!\!\diagup\!\!{}_{8}\; & {}^{1}\!\!\diagup\!\!{}_{16}\; \\ {}^{1}\!\!\diagup\!\!{}_{8}\; & {}^{1}\!\!\diagup\!\!{}_{4}\; & {}^{1}\!\!\diagup\!\!{}_{8}\; \\ {}^{1}\!\!\diagup\!\!{}_{16}\; & {}^{1}\!\!\diagup\!\!{}_{8}\; & {}^{1}\!\!\diagup\!\!{}_{16}\; \\ \end{matrix} \right]

     

    (1)核大小为 5\times5

                                                                              \frac{1}{273}\times \left[ \begin{matrix} 1 & 4 & 7 & 4 & 1 \\ 4 & 16 & 26 & 16 & 4 \\ 7 & 26 & 41 & 26 & 7 \\ 4 & 16 & 26 & 16 & 4 \\ 1 & 4 & 7 & 4 & 1 \\ \end{matrix} \right]

     

    高斯滤波让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。如下图所示,中心位置权重最高为0.4。

     

     

    二、源代码

    function varargout = ImageProcess(varargin)
    % IMAGEPROCESS MATLAB code for ImageProcess.fig
    %      IMAGEPROCESS, by itself, creates a new IMAGEPROCESS or raises the existing
    %      singleton*.
    %
    %      H = IMAGEPROCESS returns the handle to a new IMAGEPROCESS or the handle to
    %      the existing singleton*.
    %
    %      IMAGEPROCESS('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in IMAGEPROCESS.M with the given input arguments.
    %
    %      IMAGEPROCESS('Property','Value',...) creates a new IMAGEPROCESS or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before ImageProcess_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to ImageProcess_OpeningFcn via varargin.
    %
    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
    %      instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES
    
    % Edit the above text to modify the response to help ImageProcess
    
    % Last Modified by GUIDE v2.5 28-May-2015 23:28:37
    
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @ImageProcess_OpeningFcn, ...
                       'gui_OutputFcn',  @ImageProcess_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
    
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    % End initialization code - DO NOT EDIT
    
    
    % --- Executes just before ImageProcess is made visible.
    function ImageProcess_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to ImageProcess (see VARARGIN)
    
    % Choose default command line output for ImageProcess
    
    global ImagesShownCnt;
    ImagesShownCnt = 0;
    
    set(handles.axes1,'visible','off')
    set(handles.axes2,'visible','off')
    set(handles.axes3,'visible','off')
    set(handles.axes4,'visible','off')
    set(handles.axes5,'visible','off')
    set(handles.axes6,'visible','off')
    set(handles.axesSrcImg,'visible','off')
    setappdata(0,'thr',0.0);
    handles.output = hObject;
    
    % Update handles structure
    guidata(hObject, handles);
    % UIWAIT makes ImageProcess wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    
    % --- Outputs from this function are returned to the command line.
    function varargout = ImageProcess_OutputFcn(hObject, eventdata, handles) 
    % varargout  cell array for returning output args (see VARARGOUT);
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Get default command line output from handles structure
    varargout{1} = handles.output;
    
    
    % --------------------------------------------------------------------
    function File_Callback(hObject, eventdata, handles)
    % hObject    handle to File (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    
    % --------------------------------------------------------------------
    function Open_Callback(hObject, eventdata, handles)
    % hObject    handle to Open (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    
    % --------------------------------------------------------------------
    function Save_Callback(hObject, eventdata, handles)
    % hObject    handle to Save (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    
    % --------------------------------------------------------------------
    function Save_As_Callback(hObject, eventdata, handles)
    % hObject    handle to Save_As (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    
    % --- Executes on button press in pushbutton3.
    function pushbutton3_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton3 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    global srcImg;
    global dstImg;
    global doubledstImg;
    global doublesrcImg;
    % IMGTYPE 
    % 0  Gray
    % 1  Color
    global IMGTYPE;
    [filename, pathname] = uigetfile({'*.bmp;*.jpg;*.png;*.jpeg;*.tif'},'Pick an image');
    if isequal(filename,0)||isequal(pathname,0)
        return;
    end
    fpath=[pathname filename];
    srcImg=imread(fpath);
    axes(handles.axesSrcImg);
    imshow(srcImg);
    if length(size(srcImg))>2
        IMGTYPE = 1;
    else
        IMGTYPE = 0;
    end
    dstImg = srcImg;
    doubledstImg = im2double(dstImg);
    doublesrcImg = im2double(srcImg);
    %title('原始图像','fontsize',8);
    
    
    % --- Executes on button press in pushbuttonSave.
    function pushbuttonSave_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbuttonSave (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    function varargout = getthreshold(varargin)
    % GETTHRESHOLD MATLAB code for getthreshold.fig
    %      GETTHRESHOLD, by itself, creates a new GETTHRESHOLD or raises the existing
    %      singleton*.
    %
    %      H = GETTHRESHOLD returns the handle to a new GETTHRESHOLD or the handle to
    %      the existing singleton*.
    %
    %      GETTHRESHOLD('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in GETTHRESHOLD.M with the given input arguments.
    %
    %      GETTHRESHOLD('Property','Value',...) creates a new GETTHRESHOLD or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before getthreshold_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to getthreshold_OpeningFcn via varargin.
    %
    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
    %      instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES
    
    % Edit the above text to modify the response to help getthreshold
    
    % Last Modified by GUIDE v2.5 25-May-2015 21:49:34
    
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @getthreshold_OpeningFcn, ...
                       'gui_OutputFcn',  @getthreshold_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
    
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    % End initialization code - DO NOT EDIT
    
    
    % --- Executes just before getthreshold is made visible.
    function getthreshold_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to getthreshold (see VARARGIN)
    
    % Choose default command line output for getthreshold
    handles.output = hObject;
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes getthreshold wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    
    % --- Outputs from this function are returned to the command line.
    function varargout = getthreshold_OutputFcn(hObject, eventdata, handles) 
    % varargout  cell array for returning output args (see VARARGOUT);
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Get default command line output from handles structure
    varargout{1} = handles.output;
    
    
    
    function edit1_Callback(hObject, eventdata, handles)
    % hObject    handle to edit1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Hints: get(hObject,'String') returns contents of edit1 as text
    %        str2double(get(hObject,'String')) returns contents of edit1 as a double
    
    
    % --- Executes during object creation, after setting all properties.
    function edit1_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
    
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
    
    
    % --- Executes on button press in pushbuttonDonoho.
    function pushbuttonDonoho_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbuttonDonoho (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    global doubledstImg;
    thresh = Donoho(doubledstImg);
    set(handles.edit1,'string',num2str(thresh));
    
    

    三、运行结果

    在这里插入图片描述

    完整代码或者仿真咨询添加QQ1575304183

    展开全文
  • 详解均值滤波,高斯滤波,中值滤波,双边滤波,方框滤波 滤波器种类 线性滤波: 方框滤波、均值滤波、高斯滤波 非线性滤波: 中值滤波、双边滤波图像 图像滤波要求: 不能损害图像的轮廓边缘, 图像清晰视觉效果更...
  • 主要参照了其他网站的一些信息,结合得到以下结果: a=imread('mengnalisha.jpg'); b=rgb2gray(a); subplot(241),imshow(a),title('原图'); subplot(242),imshow(b),title('灰度图');... %定义一个3*3的均值滤波器
  • 转载自这里 目录 均值滤波 中值滤波 最大最小值滤波 scipy模拟中值滤波 ...值滤波是用每个像素它周围像素计算出来的平均值替换图像中每个像素。采样Kernel数 据通常是3X3的矩阵,如下表示: 从...
  • 人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,...
  • 对于图像的每一个像素点,计算它的邻域像素滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值,这样就完成了滤波过程。 不难发现,用3×3的核对一副6×6的图像进行卷积,得到的是4×4的图,图片缩小了...
  • 最后基于2种改进算法提出了一种红外图像滤波方法,即依次采用改进伪中值滤波算法基于先验信息的改进非局部均值滤波算法对红外图像进行滤波处理,然后将其与参考图像进行融合,以修正被过度滤波的图像。实验结果表明,...
  • 1、应用:可以说,一切需要求某个邻域内像素之的场合,都有方框滤波的用武之地,比如:均值滤波、引导滤波、计算Haar特征等等。 2、优势:速度快。它可以使复杂度为O(MN)的求和,求方差等运算降低到O(1)或近似于O...
  • 对常见的滤波算法进行分析,在此基础上提出“近均值...在与均值滤波中值滤波及部分改进的滤波算法进行实验对比后,确定提出的第七种滤波算法具有更好的滤波效果,能适应不同类型的噪声,其普适性实用性进一步增强。
  • 使用 view_as_blocks (来源于skimage.util)函数。...在每个方块内部,我们计算均值、最大值中位值,然后用这些值表示这个方块的值。处理后结果被放在一起展示,结果中第一张图像为使用三次样条插值...
  • 针对井下光线较差、粉尘大而导致视频监控图像清晰度不佳的问题,提出了一...分别采用该算法与中值滤波算法、均值滤波算法、非局部均值滤波算法对现场采集的图像进行测试,结果表明该算法的图像处理效果明显优于其他算法。
  • 比较均值滤波中值滤波、高斯滤波在不同窗口尺寸下,对于不同噪音(椒盐噪音、高斯噪音)的抑制效果。 #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; ...
  • 平滑算法有很多种,这里进行两种平滑滤波算法——均值滤波和中值滤波的比较,滤波器模板均为 3*3;在滤波器都需要延拓两行两列,使用镜像的延拓方式。下面是各自算法的描述。 实验思路 均值滤波首先取出计算的像素点...
  • 【图像处理】快速均值滤波

    千次阅读 2015-08-22 16:13:12
    从左上到右下划过整个图像,看似简单,可是当仔细研究,会发现,这一机械式的循环过程中包含了大量的重复计算,,,对于我这种重度强迫症患者,,,简直不能忍,,,,来看一个快速的均值滤波算法思路:因为一个数据...
  • 提出了一种利用均值加速的快速中值滤波算法,它能有效地降低中值滤波算法的时间复杂度,将计算效率运算速度提高到传统快速滤波算法的两倍以上。该算法应用于大型辐射图像的滤波处理中,取得了良好的效果,提高了图像...
  • 线性滤波有方框滤波、均值滤波和高斯滤波;非线性滤波有中值滤波和双边滤波 0 邻域滤波(卷积) 邻域算子值利用给定像素周围像素的值决定此像素的最终输出。如图左边图像与中间图像卷积禅城右边图像。...
  • 对比均值滤波和中值滤波 1.均值滤波 对于中值滤波器,就是设定一定大小的核,计算核包含的像素点对应的中值。 median[a11a12⋯a1na21a22⋯a2n⋮⋮⋱⋮am1am2⋯amn]median{\begin{bmatrix} {a_{11}}&{a_{12}}&...
  • 结合的步骤(以均值滤波和中值滤波结合为例) 对较大区域进行线性滤波 计算线性滤波输出的中值作为混合滤波的结果 以1-D信号混合为例 是一个 1-D 信号,用子结构、、、......、组成的线性中值混合滤波可定...
  • /* 模糊与消噪 模糊原理(线性滤波) ●Smooth/Blur 是图像处理中最简单常用的操作之一 ●使用该操作的原因之一-就为了给图像预处理时候减低噪声 ●使用Smooth/Blur操作其背后...归一化盒子滤波(均值滤波) 高斯滤波...
  • 中值滤波计算方式如图5-21所示,将滤波器范围内所有的像素值按照由小到大的顺序排列,选取排序序列的中值作为滤波器中心处黄色像素的新像素值,之后将滤波器移动到下一个位置,重复进行排序取中值的操作,直到将图像...
  • 现在我们必须使用均值滤波和中值滤波对噪声图像进行去噪。 我们必须根据噪声类型应用适当的滤波器。 要计算高斯蒙版的权重,请使用 5)还附有用于PSNR的代码-用于计算PSNR值。 6)原始(干净)图像和去噪后的图像...
  • 以锚节点作为参考节点,采用基于均值滤波中值滤波和高斯滤波的混合滤波方法优化RSSI值,运用最小二乘法估计环境参数,再由盲节点与锚节点的RSSI混合滤波优化值计算二者之间的距离。仿真结果表明,混合滤波性能优于其它...
  • /* *本程序的目的旨在对前面介绍的滤波器进行一个比较 *对比每种滤波器的滤波效果耗时 *除双边滤波外其他滤波器... *sigmaColorsigmaSpace的值均由直径计算而来 */#include #include #include <opencv2/highgu
  • OpenCV中提供了五种滤波方法,分别是均值滤波、不缩放比例均值滤波中值滤波、高斯滤波和双边滤波。前两种滤波实质上属于一种滤波方法,只不过“不缩放比例均值滤波”比“均值滤波”在计算处理速度上要快一些。下面...
  • 以锚节点作为参考节点,采用基于均值滤波中值滤波和高斯滤波的混合滤波方法优化RSSI值,运用最小二乘法估计环境参数,再由盲节点与锚节点的RSSI混合滤波优化值计算二者之间的距离。仿真结果表明,混合滤波性能优于...
  • 通常这些卷积算子计算都是线性操作,所以又叫线性滤波 卷积过程示意如下: (灰色代表图片,黄色部分代表卷积算子,红色中心部分代表正在处理的像素) 2、有关模糊(滤波)的API(Applicati...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 124
精华内容 49
关键字:

均值滤波和中值滤波计算