智能车制作

标题: 摄像头中值滤波中的一个不解 [打印本页]

作者: zhl1122    时间: 2013-3-27 19:46
标题: 摄像头中值滤波中的一个不解
void Image_Filte(void) {
  unsigned char *a_point,*b_point,*c_point;
  unsigned char a,b,c,d,i,j;     
  for(i=0;i<ROW;i++) {
     for(j=1;j<COLUMN;j++){
     a_point=&Buffer[i][j-1];
     b_point=&Buffer[i][j];
     c_point=&Buffer[i][j+1];  
      a=*a_point;
      b=*b_point;
      c=*c_point;   
   if(a>=b) {
        d=b;b=a;a=d;
      }
   if(a>=c){
        d=c;c=a;a=d;
      }  
    if(b>=c){
        d=c;c=b;b=d;
      }
     *(b_point)=b;
     }              
  }
}


*(b_point)的值不是每次都会被Buffer[i][j]; 重新赋值吗?请问这里面的 *(b_point)=b;是什么作用
其中ROW是行数,COLUMN是列数

作者: 1228463834    时间: 2013-3-27 22:25
首先 *(b_point)等于 Buffer[i][j];     
然后经过排序后*(b_point)正好就是中值
最后这就滤波了


作者: zhl1122    时间: 2013-3-29 15:38
1228463834 发表于 2013-3-27 22:25
首先 *(b_point)等于 Buffer[j];     
然后经过排序后*(b_point)正好就是中值
最后这就滤波了

*()
作者: zhl1122    时间: 2013-3-29 15:44
zhl1122 发表于 2013-3-29 15:38
*()

*(b_point)=b这句语句放在第二个for语句里面,那不是每次j改变一个值,*(b_point)都被重新赋值,最后*(b_point)的值应该是最后一个j所得到的,那前面被赋值不是没有意义了吗?
作者: 1228463834    时间: 2013-3-29 17:48
zhl1122 发表于 2013-3-29 15:44
*(b_point)=b这句语句放在第二个for语句里面,那不是每次j改变一个值,*(b_point)都被重新赋值,最后 ...

*(b_point)=b 放在内层循环里才会处理整幅图像。这段代码,理论上应该是好使的,而且单片机处理能力来看,也能滤波,但不一定能达到你所想要的效果。至于为什么,等下我慢慢解释给你听。
假设,楼主对C语言的指针有所了解的话,那   
    a_point=&Buffer[j-1];
     b_point=&Buffer[j];
     c_point=&Buffer[j+1];  
这三句话,你就懂了。
假设,楼主对C语言水平上一个等次,不说会选择,插入排序,就会简单的冒泡排序的话,那
if(a>=b) {
        d=b;b=a;a=d;
      }
   if(a>=c){
        d=c;c=a;a=d;
      }  
    if(b>=c){
        d=c;c=b;b=d;
      }
这三个if语句,你就懂了。
假设,楼主对中值滤波有一定的了解,不说会什么平滑啊,什么矫正啊,就会简单的滤波,那
*(b_point)=b;
这个语句,你就懂了。
最后你会发现,哎呀,这段代码能滤波耶


作者: loso    时间: 2013-4-2 22:31
简单的说就是 用调用指针的方法把该点、之前的点和之后的点都拿出来,然后排个序,把中间的值打出来附在该点上。
b_point是一个指针,b_point=&Buffer[i][j]指向的是你要算的点,*(b_point)=b是把那个中值赋予到你算的那个点上
作者: 牧℡〆风︶ㄣ    时间: 2013-4-23 10:20
搜罗的一些资料,呵呵
希望对楼主有用
作者: 牧℡〆风︶ㄣ    时间: 2013-4-23 10:59
自己做了一个简单的中值滤波的函数:
int Mid_Lvbo(int x, int y, int z)
{
  int a=0;
  int b=0;
  int c=0;
  int m=0;
  
  a=x;
  b=y;
  c=z;
  
  if(a>b)
  {
    m=a;
    a=b;
    b=m;
  }
  if(a>c)
  {
    m=a;
    a=c;
    c=m;
  }
  if(b>c)
  {
    m=b;
    b=c;
    c=m;
  }
  return b;
}
void main()
{
  int i=0;
  int temp=0;
  int aa[10]={9,10,7,8,8,4,5,2,3,0};
  for(i=1; i<9 ;i++)
  {
    temp=Mid_Lvbo(aa[i-1], aa[i], aa[i+1]);
    aa[i]=temp;
  }
  
  while(1)
  {}
}

改变数组的元素运行了几次:
将结果记录如下:(a[10]中值滤波前 >> a[10]中值滤波后)
0123456789 >> 0123456789

9876543210 >> 9876543210

9876843210 >> 9877743210

9876841210 >> 9877742210

9876845210 >> 9877755210

9 10 7 8 8 4 5 2 3 0 >> 9 9 8 8 8 5 5 3 3 0

还有一点容易出错的需要注意的是
有的网上的函数是这样写的:
/****************中值滤波******************
       说明:取三个数的中值
***************************************/
  unsigned get_mid(int a,int b,int c)
    {
    int x;
    if(a>b) {x=b;b=a;a=x;}
    if(b>c) {x=c;c=b;b=x;}
    if(c>a) {x=a;a=c;c=x;}
     return b;
    }
但是这样的函数返回的不一定是abc的中值
很简单可以自己写几个数试试
作者: 梁大力    时间: 2015-3-31 20:24
用调用指针的方法把该点、之前的点和之后的点都拿出来,然后排个序,把中间的值打出来附在该点上。
b_point是一个指针,b_point=&Buffer[i][j]指向的是你要算的点,*(b_point)=b是把那个中值赋予到你算的那个点上
作者: 小六哥哥    时间: 2018-11-4 20:35
用调用指针的方法把该点、之前的点和之后的点都拿出来,然后排个序,把中间的值打出来附在该点上。
b_point是一个指针,b_point=&Buffer[i][j]指向的是你要算的点,*(b_point)=b是把那个中值赋予到你算的那个点上
作者: 七年丶    时间: 2019-3-18 22:12
谢谢楼主分享




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2