均值滤波和中值滤波属于空域图像增强的处理方法,均值滤波去麻点,中值滤波保边缘。
要进行均值滤波首先要生成一个3x3矩阵。算法运算窗口一般采用奇数点的邻域来计算中值,最常用的窗口有3X3和5X5模型。
1、通过2个或者3个RAM的存储来实现3X3像素窗口。
2、通过2个或者3个FIFO的存储来实现3X3像素窗口。
3、通过2行或者3行Shift_RAM的存储来实现3X3像素窗口。
扩展资料:
注意事项:
1、空间域指图像本身,空域变换直接对图像中的像素进行 *** 作。
2、在进行横向滑动窗口滤波时,窗口中的像素仅仅是丢掉了左侧一列,增加了右侧一列数据,如果丢掉中间重叠的这一部分数据,到下个窗口再重新寻址和读取数据,无疑是计算的沉重负担,所以该算法的核心思想就是充分利用重叠部分,使用直方图来计算中值,不需要排序算法,快,且高效。
3、注意到两个直方图的累加是一个O(1) *** 作,和直方图的元素个数有关,而直方图元素个数是由图像位深决定的。
参考资料来源:百度百科-均值滤波
参考资料来源:百度百科-中值滤波
1、限幅滤波算法:首先根据经验确定出两次采样允许的最大偏差值(设为A);每次检测到新数值时判断,如果本次数值与上次数值之差小于或等于A,则本次数值有效;否则,本次数值无效,放弃本次数值,用上次数值代替本次数值。
2、中值滤波算法:是对某一参数连续采样N次(N取奇数)后,再将N个数按从大到小或从小到大排列(比如冒泡法),最中间的数作为本次滤波结果。
中值滤波medfilt2,用法b
=
medfilt2(a,
[m
n])
你的两点错误
一、输入图像a,应该是二维矩阵
你用输入图像b是由imread得到的a加上噪声得到的
而imread读到的图像a通常是3维rgb图,是三维矩阵
直接用medfilt2是不对的,可以先用rgb2gray(a)将a先转换为灰度矩阵
二、中值滤波也要指定滤波模版的大小
medfilt2需要两个输入参数,第一个是图像a
第二个参数需要输入一个长度是二的向量,[m
n]
指定模版的大小,m行n列
/
函数名称:
FindMedianValue()
函数参数:unsigned char pTemplate -模版指针
int templLen -模版数组长度
返回值:
无
提示: !该函数对模版快速排序,会修改原模版的值,
说明:本函数查找数组中值,联合quicksort 和 partition 函数
对输入数组长为奇数最好
长度为偶数时返回的是中间前一个的值
/
unsigned char ImgEnhance::FindMedianValue(unsigned char pTemplate,int templLen)
{
unsigned char MedianValue;
Quicksort(pTemplate,0,templLen-1,templLen);
MedianValue=pTemplate[(templLen-1)/2];
return MedianValue;
}
/
函数名称:
Quicksort()
函数参数:unsigned char pTemplate -模版指针
int templLen -模版数组长度
int low -数组区间底
int high -数组区间顶
返回值:
空
说明:
/
void ImgEnhance::Quicksort(unsigned char pTemplate,int low,int high,int templLen)
{
int pivotpos;
if(low<high)
{
pivotpos=Partition(pTemplate,low,high); //对pTemplate[lowhigh]做划分
if(pivotpos==(templLen-1)/2)
return;
else if(pivotpos>(templLen-1)/2)
Quicksort(pTemplate,low,pivotpos-1,templLen); //中值在左区间,对左区间递归排序
else
Quicksort(pTemplate,pivotpos+1,high,templLen); //中值在右区间,对右区间递归排序
}
}
/
函数名称:
Partition()
函数参数:unsigned char pTemplate -模版指针
int i -数组区间底
int j -数组区间顶
返回值:
该区间的一个划分点,该点左边的值都比它小,右边的值都比它大
说明:本函数查找区间划分点,且是将该区间的第一个值放在这个划分点上
/
int ImgEnhance::Partition(unsigned char pTemplate,int i,int j)
{
int pivot=pTemplate[i]; //用区间的第1个记录作为基准
while(i<j) //从区间两端交替向中间扫描,直至i=j为止
{
while(i<j && pTemplate[j]>=pivot) //pivot相当于在位置i上
j--; //从右向左扫描,查找第1个关键字小于pivot的记录pTemplate[j]
if(i<j) //表示找到的pTemplate[j]的关键字<pivot
pTemplate[i++]=pTemplate[j]; //相当于交换pTemplate[i]和pTemplate[j],交换后i指针加1
while(i<j && pTemplate[i]<=pivot) //pivot相当于在位置j上
i++; //从左向右扫描,查找第1个关键字大于pivot的记录pTemplate[i]
if(i<j) //表示找到了pTemplate[i],使pTemplate[i]>pivot
pTemplate[j--]=pTemplate[i]; //相当于交换pTemplate[i]和pTemplate[j],交换后j指针减1
}//end while
pTemplate[i]=pivot; //基准记录已被最后定位
return i;
}
以上就是关于计算3x3窗口的均值滤波和中值滤波(向下取整保留整数值)。全部的内容,包括:计算3x3窗口的均值滤波和中值滤波(向下取整保留整数值)。、由单片机实现滤波。限幅滤波和中值滤波、中值滤波怎么算等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)