计算3x3窗口的均值滤波和中值滤波(向下取整保留整数值)。

计算3x3窗口的均值滤波和中值滤波(向下取整保留整数值)。,第1张

均值滤波和中值滤波属于空域图像增强的处理方法,均值滤波去麻点,中值滤波保边缘。

要进行均值滤波首先要生成一个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窗口的均值滤波和中值滤波(向下取整保留整数值)。、由单片机实现滤波。限幅滤波和中值滤波、中值滤波怎么算等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10104078.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存