1、中值滤波的原理:对于一串连续输入的信号(量化后是一组数据)。如下图所示,是输入的原信号。中值滤波的原理为,重新计算每一个x的输出值(y),新的输出值。
相当于y=new(x),new的 *** 作是,从在以x为中心,长度为2k的原信号中(区间为[x-k+1,x+k]),提取出这段区间内中间的那个值,作为y=new(x)的结果。
2、举例来说,输入:Y[1-10]:1,2,3,4,5,6,7,8,9,10.取区间2k=4,所以k=2执行中值滤波K=中值滤波(Y)、由x-k+1>=1,所以当k=2时,x>=2、滤波时:
K[1]=Y[1]
K[2]=(Y[1]、Y[2]、Y[3]、Y[4])的中间值,即为2或3。
3、matlab的中值滤波实现方式:调用函数:A=medfilt1(B,n)、B为输入信号,A为滤波后的信号,即结果。
4、对于输入信号(最开头的图),以下分别为设置区间n=8和n=16得到的滤波图像。中值滤波可以过滤尖峰脉冲。目的在于我们对于滤波后的数据更感兴趣。滤波后的数据保留的原图像的变化趋势,同时去除了尖峰脉冲对分析造成的影响。
谢谢你贴的代码,这个FB写得真不错。这个FB思路是这样的,建了个先入先出的队列(这儿叫堆栈,先入先出的结构应该叫队列),然后FB刷新一次,后面就补充一个当前值,如果队列满了,那么就把最旧的那个数据扔掉,在队列最后加上最新的数据。
流程如下:
1. 存入最新值
2. 开辟临时数组,为后面排序做准备。
3. 排序,把当前队列里的值按降序排列
4. 用数列的下标,把最中间下标那个值取出来,就是中间值了。(第三步排序过)
是降序还是升序我没仔细看,可能看错。
这个filter是用来平滑图像用的,简单来说是对一幅(width * height)大小的图像按下述方法进行平滑化,以达到除去图像中噪声的目的。
首先把输入图像中每个像素点和该像素点四周的8个像素点作为一组来看,将这9个像素点的灰度进行排序后取最中间的那个灰度值作为这个像素点平滑化后的灰度值。
参数corrupted用来指向一幅有噪声的图像空间,参数smooth用来指向平滑化处理后的图像空间,width和height分别为图像的宽和高。
那么做main函数就应该知道怎么写了才对。
如果你能读入一幅图像并把图像里的各像素点保存到一个unsigned char数组里是最好的,不能的话可以自己虚构一幅图像来尝试滤波。
比如我们有下述5*5大小的图像(灰度范围0-255):
static unsigned char image[] = {
50, 50, 50, 50, 50,
50, 52, 48, 50, 50,
50, 50, 50, 0, 50,
50, 48, 53, 50, 50,
50, 50, 50, 50, 50,
}
本来这幅图像应该是全灰度为50的图像,但是现在某些像素点混入了噪声(非50的像素点即为噪声)
把它送入medianFilter后即可得到平滑化后的全灰度为50的图像。
参考代码:
#include <memory.h>#include <stdio.h>
static unsigned char image[] = {
50, 50, 50, 50, 50,
50, 52, 48, 50, 50,
50, 50, 50, 0, 50,
50, 48, 53, 50, 50,
50, 50, 50, 50, 50,
}
#define WIDTH 5
#define HEIGHT 5
void medianFilter (unsigned char* corrupted, unsigned char* smooth, int width, int height)
{
memcpy ( smooth, corrupted, width*height*sizeof(unsigned char) )
for (int j=1j<height-1j++)
{
for (int i=1i<width-1i++)
{
int k = 0
unsigned char window[9]
for (int jj = j - 1 jj < j + 2 ++jj)
for (int ii = i - 1 ii < i + 2 ++ii)
window[k++] = corrupted[jj * width + ii]
// Order elements (only half of them)
for (int m = 0 m < 5 ++m)
{
int min = m
for (int n = m + 1 n < 9 ++n)
if (window[n] < window[min])
min = n
// Put found minimum element in its place
unsigned char temp = window[m]
window[m] = window[min]
window[min] = temp
}
smooth[ j*width+i ] = window[4]
}
}
}
int main()
{
unsigned char output[WIDTH * HEIGHT]
int i, j
medianFilter(image, output, WIDTH, HEIGHT)
for(i=0 i<HEIGHT i++)
{
for(j=0 j<WIDTH j++)
{
printf("%d\t", output[i*WIDTH+j])
}
printf("\n")
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)