中值滤波

简介: <p>中值滤波是一种典型的非线性滤波技术,在一定条件下可以克服线性滤波器(如均值滤波)带来的图像细节模糊。</p> <p>优点:消除杂散噪声点而不会或较小程度地造成边缘模糊。</p> <p>缺点:对于图像中含有较多点、线、尖角细节的,不适宜采用中值滤波。</p> <p>基本思想:将模板(如方形、线形、十字形、菱形等)中的像素值从小到大排序,将中值代替模板中间的或者指定位置的像素值。<

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

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

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

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


下面给出模板为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];//取中值代替模板中心位置的像素值
		}
	}


目录
相关文章
|
机器学习/深度学习 人工智能 算法框架/工具
《YOLOv10魔术师专栏》专栏介绍 & 专栏目录
【7月更文挑战第4天】 【原创自研模块】【多组合点优化】【注意力机制】 【主干篇】【neck优化】【卷积魔改】 【block&多尺度融合结合】【损失&IOU优化】【上下采样优化 】 【小目标性能提升】【前沿论文分享】【训练实战篇】
368 1
|
数据可视化 前端开发 JavaScript
数据可视化技术的较量:D3.js与Tableau的比较与选择
在当今信息爆炸的时代,数据可视化成为了帮助我们理解和传达数据的重要工具。本文将重点对比并评估两个主流的数据可视化技术和工具,即D3.js和Tableau。我们将探讨它们的优势、适用场景以及选择的关键因素,以帮助读者在选择合适的数据可视化工具时做出明智的决策。
|
存储 JSON 网络协议
阿里巴巴FastJSON使用实例
阿里巴巴FastJSON使用实例
1202 0
|
存储 NoSQL API
redis的5种对象与8种数据结构(一)
【说明】  本文是对redis对象、数据结构的整理说明,因为内容较多,本篇文章只对对象结构,1种对象——字符串对象,以及字符串对象所对应的两种编码——raw和embstr,进行了详细介绍,其余对象及编码将再下一篇文章中进行详细说明。
14009 0
|
网络协议
Netty实现TCP通信
Netty实现TCP通信
240 0
|
前端开发 JavaScript Java
谷粒商城笔记+踩坑(3)——商品服务-三级分类、网关跨域
商品服务-三级分类增删改查、跨域问题、逻辑删除
|
XML 监控 前端开发
史上最全SpringBoot面试题(一)
史上最全SpringBoot面试题(一)
|
存储 芯片 内存技术
计算机组成原理常见面试题目总结,含答案
计算机组成原理常见面试题目总结,含答案
|
Java
Java后台返回树形结构的二种方式
Java后台返回树形结构的二种方式
753 0