c语言的一些常见的算法以及思考和改进的文章,写的很不错,花费了很大的精力从网络了搜罗的,希望大家喜欢.
源代码在线查看: 中值滤波算法改进之c语言实现.txt
中值滤波算法改进之C语言实现[原创]
这里所说的改进,主要是指中值计算方法的改进,求出中值以后,仍按原来的方法进行图像处理。
具体思路请看user1/20989/archives/2005/367726.shtml
//
关于中值滤波算法的进一步思考[原创]
在图像处理中,可能需要去除噪声,常用的有邻域平均法,即用窗口在图像上滑动,并且把窗口中心对应的图像中的像素值修改为邻域(即窗口)的代数平均值。但是在图像边缘轮廓包含有大量的高频信息,而邻域平均法实质上是一个低通滤波器,直接使用邻域平均法会使得边界变模糊。
后来有人提出邻域加权平均法作为改进,给窗口内不同位置的像素设不同的权,从而可以减少模糊性而较好地保留边缘信息。
为了既能去除噪声,又能保留边界信息,可以使用中值滤波算法。中值滤波算法仍使用滑动窗口技术,但把窗口中心对应的图像像素修改为窗口所覆盖的所有的像素的中间值(即把窗口覆盖的所有像素值按升序或降序顺序排列,然后取中间值)。这样一来,噪声(明亮区的少数暗点或暗区的少数明亮点或者是最小值或者是最大值,取中间值可以直接丢弃这些值而不参加运算)就可以被去除,而能较好保留边缘信息。
目前的中值滤波中“中值”一般取“中位数”,即所有元素排序后中间位置上的元素值。但是排序需要移动大量元素,效率较低。并且,我们只是为了找中值,所以不需要真的去排序。有人提出对快速排序法进行修改,当排序支点位于原数组中间位置时,即可结束循环。但仍需要移动元素位置。
思考:对窗口中的所有元素一次扫描,对于第i位置的元素,如果窗口中其他元素中有large个元素值大于i位置的元素,而有little个元素值小于i位置的元素,并且large==little或者两者差为1或在一个合理范围之内,我们则可认为i位置上的元素值为中值。
突然有了这么一个想法,等有时间再写个代码测试一下,也希望同行专家从理论上来验证一下这个想法是否可行。
//
通过设置不同大小的数组,发现这个改进并不是很成功,尤其在数组中有大量相同元素时,可能会出现一些错误。但如果元素很少有重复时,效果比较理想。
代码如下,通过两种方法计算中值:
/*
程序功能:求中值
作者:BugEyes
主页:http://bugeyes.blog.edu.cn
*/
#i nclude
int middle(int array[],int n)
{
int i,j;
int large=0,little=0;
for(i=0;i {
if(i>0&&((array[i]>array[i-1]&&large continue;
large=little=0;
for(j=0;j if(j!=i)
{
if(array[j]>=array[i])
large++;
if(array[j] little++;
}
if(abs(large-little) break;
}
return i;
}
void sort(int array[],int n)
{
int i,j;
for(i=0;i for(j=0;j if(array[j]>array[j+1])
{
int t=array[j];
array[j]=array[j+1];
array[j+1]=t;
}
}
void output(int array[],int n)
{
int i;
for(i=0;i {
if(i%20==0)
printf("\n");
printf("%4d",array[i]);
}
}
void main()
{
int i,pos;
int data[1001];
clrscr();
for(i=0;i data[i]=random(150);
pos=middle(data,1001);
printf("\nThe original data is:\n");
output(data,1001);
printf("\nThe middle value is:%4d.The position is:%4d",data[pos],pos);
sort(data,1001);
printf("\nThe sorted data is:\n");
output(data,1001);
printf("\nThe middle value from second method is:%4d",data[500]);