中值滤波

中值滤波是一种典型的非线性滤波技术,在一定条件下可以克服线性滤波器(如均值滤波)带来的图像细节模糊。

优点:消除杂散噪声点而不会或较小程度地造成边缘模糊。

缺点:对于图像中含有较多点、线、尖角细节的,不适宜采用中值滤波。

基本思想:将模板(如方形、线形、十字形、菱形等)中的像素值从小到大排序,将中值代替模板中间的或者指定位置的像素值。

下面给出模板为3x3大小方形的中值滤波C++源代码:

	/**************中值滤波**************
	//Luma
	for( y = 1; y < height-1; y++ )
	{
		pBgf += stride;
		for( x = 1; x < width-1; x++ )
		{
			//Insertion-Sort(A):3x3
			Pel A[9];
			A[0]=(pBgf-stride)[x-1];	A[1]=(pBgf-stride)[x];	A[2]=(pBgf-stride)[x+1];
			A[3] = pBgf[x-1];	A[4] = pBgf[x];	A[5] = pBgf[x+1];
			A[6]=(pBgf+stride)[x-1];	A[7]=(pBgf+stride)[x];	A[8]=(pBgf+stride)[x+1];
			for(int j=1; j<9; j++)
			{
				Pel key=A[j];
				int i=j-1;
				while( i>0 && A[i]>key )
				{
					A[i+1]=A[i];
					i=i-1;
				}
				A[i+1]=key;
			}
			pBgf[x] = A[5];//取中值代替模板中心位置的像素值
		}
	}

	height >>= 1;
	width  >>= 1;
	stride >>= 1;
	//Cb
	pBgf = pcPicYuvBgf->getCbAddr();
	for( y = 1; y < height-1; y++ )
	{
		pBgf += stride;
		for( x = 1; x < width-1; x++ )
		{
			//Insertion-Sort(A):3x3
			Pel A[9];
			A[0]=(pBgf-stride)[x-1];	A[1]=(pBgf-stride)[x];	A[2]=(pBgf-stride)[x+1];
			A[3] = pBgf[x-1];	A[4] = pBgf[x];	A[5] = pBgf[x+1];
			A[6]=(pBgf+stride)[x-1];	A[7]=(pBgf+stride)[x];	A[8]=(pBgf+stride)[x+1];
			for(int j=1; j<9; j++)
			{
				Pel key=A[j];
				int i=j-1;
				while( i>0 && A[i]>key )
				{
					A[i+1]=A[i];
					i=i-1;
				}
				A[i+1]=key;
			}
			pBgf[x] = A[5];//取中值代替模板中心位置的像素值
		}
	}
	//Cr
	pBgf = pcPicYuvBgf->getCrAddr();
	for( y = 1; y < height-1; y++ )
	{
		pBgf += stride;
		for( x = 1; x < width-1; x++ )
		{
			//Insertion-Sort(A):3x3
			Pel A[9];
			A[0]=(pBgf-stride)[x-1];	A[1]=(pBgf-stride)[x];	A[2]=(pBgf-stride)[x+1];
			A[3] = pBgf[x-1];	A[4] = pBgf[x];	A[5] = pBgf[x+1];
			A[6]=(pBgf+stride)[x-1];	A[7]=(pBgf+stride)[x];	A[8]=(pBgf+stride)[x+1];
			for(int j=1; j<9; j++)
			{
				Pel key=A[j];
				int i=j-1;
				while( i>0 && A[i]>key )
				{
					A[i+1]=A[i];
					i=i-1;
				}
				A[i+1]=key;
			}
			pBgf[x] = A[5];//取中值代替模板中心位置的像素值
		}
	}
时间: 2024-12-13 02:36:52

中值滤波的相关文章

基于Opencv的自适应中值滤波函数selfAdaptiveMedianBlur()

终于搞出来了:) #include <iostream> #include <opencv2/opencv.hpp> #include <vector> #include <algorithm> using namespace cv; using namespace std; //下面的宏,定义了在矩阵src的第m行.n列,ks*ks覆盖的矩形区域内的像素,并将像素压到矢量v中 //该覆盖区域的左上角坐标为(m,n),宽为ks,高为ks,要求src必须是单通

中值滤波讲解-Matlab

一.原理: 1:通过从序列中取出奇数个数(偶数也可)据进行排序 2:用排序后的中值,(若取数为偶数,则求中间两数的均值)来取代要处理的数据即可 二.除去高频波动分量和奇异点(即离基本分布点很远的噪点) 三.实例说明 图1-整体效果图 图2-局部效果图 四.代码说明 %中值滤波-Lab10 file='Datanog7'; x=importdata([file,'/A_x.txt']); subplot(2,1,1); plot(x); b=medfilt1(x,1000); subplot(2,

opencv中值滤波和低通滤波器对椒盐噪声处理的效果比较

opencv中值滤波和低通滤波器对椒盐噪声处理的效果比较 效果: 通过比较我们可以看出,中值滤波器有很好的保留了图像的边界信息 代码: void showimage(const std::string &str,const cv::Mat &image){ namedWindow(str,CV_WINDOW_AUTOSIZE); imshow(str,image); } Mat salt(const cv::Mat &image,int n){ Mat result = image

中值滤波与图像锐化

本文主要包括以下内容 中值滤波及其改进算法 图像锐化, 包括梯度算子.拉普拉斯算子.高提升滤波和高斯-拉普拉斯变换 本章的典型囊例分析 对椒盐噪声的平滑效果比较 Laplacian与LoG算子的锐化效果比较 中值滤波 中值滤波本质上是一种统计排序滤波器. 对于原图像中某点(i,j), 中值滤波以该点为中 心的邻域内的所有像素的统计排序中值作为(i, j) 点的响应. 中值不同于均值, 是指排序队列中位于中间位置的元素的值,例如=采用3x3 中值滤披 器, 某点.(i,j) 的8 个邻域的一系列像

高效中值滤波的方法及实现

中值滤波的原理很简单:就是用滑动窗口中灰度中值代替窗口中心像素的灰度值 高效中值滤波: 代码实现: //中值滤波 //窗口大小为width_Aperture*width_Aperture的正方形 void MedianBlur(const Mat &image_Src, Mat &image_Dst, int width_Aperture) { /////////////重新分配图像(如果需要)///////////////////// int width_Dst=image_Src.co

图像的中值滤波处理

#include<iostream>using namespace std;int main(){ int n,m,i,j,k,o,u,p,a[100][100],x[100][100],max[100][100][20],b[100][100]; cout<<"输入矩阵行列数:"<<endl; cin>>n>>m; cout<<"输入原图像的亮度矩阵:"<<endl; for(i=

数字图像处理之快速中值滤波算法

快速中值滤波算法 中值滤波算法: 在图像处理中,在进行如边缘检测这样的进一步处理之前,通常需要首先进行一定程度的降噪.中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的噪声.这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用奇数个采样组成的观察窗实现这项功能.观察窗口中的数值进行排序,位于观察窗中间的中值作为输出.然后,丢弃最早的值,取得新的采样,重复上面的计算过程.中值滤波是图像处理中的一个常用步骤,它对于斑点噪声和椒盐噪声来说尤其有用.保存边缘的特性使它在不希

高效中值滤波(采用copyMakeBorder处理边界像素)

修改了之前滤波中的中值滤波算法,采用copyMakeBorder处理边界像素 void MedianBlur(const Mat &image_Src, Mat &image_Dst, int width_Aperture) { /////////////////////////////重新分配图像(如果需要)///////////////////////////////////////////// int width_Dst=image_Src.cols; int height_Dst=

Atitit &#160;&#160;图像处理&#160;平滑&#160;也称&#160;模糊,&#160;归一化块滤波、高斯滤波、中值滤波、双边滤波)

Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenCV函数如下: 归一化块滤波器 (Normalized Box Filter) § 最简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等) § 高斯滤波器 (Gaussian Filter) § 最有用的滤波器 (尽管不是最快的). 高斯滤波是将输入数组的每一个像素点与 高斯

数字图像处理------中值滤波

一 中值滤波概念 中值滤波算法以某像素的领域图像区域中的像素值的排序为基础,将像素领域内灰度的中值代替该像素的值[1]: 如:以3*3的领域为例求中值滤波中像素5的值 图1 1)int pixel[9]中存储像素1,像素2...像素9的值: 2)对数组pixel[9]进行排序操作: 3)像素5的值即为数组pixel[9]的中值pixel[4]. 中值滤波对处理椒盐噪声非常有效. 二 中值滤波代码实现 项目工程:https://github.com/ranjiewwen/Everyday_Prac