智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5084|回复: 10
打印 上一主题 下一主题

[摄像头] 摄像头中值滤波中的一个不解

[复制链接]

1

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
威望
118
贡献
56
兑换币
75
注册时间
2012-12-16
在线时间
18 小时
毕业学校
浙江万里学院
跳转到指定楼层
1#
发表于 2013-3-27 19:46:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
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是列数

31

主题

1084

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5125

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章

威望
2630
贡献
1311
兑换币
922
注册时间
2011-5-8
在线时间
592 小时
2#
发表于 2013-3-27 22:25:20 | 只看该作者
首先 *(b_point)等于 Buffer[i][j];     
然后经过排序后*(b_point)正好就是中值
最后这就滤波了

回复

使用道具 举报

1

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
威望
118
贡献
56
兑换币
75
注册时间
2012-12-16
在线时间
18 小时
毕业学校
浙江万里学院
3#
 楼主| 发表于 2013-3-29 15:38:40 | 只看该作者
1228463834 发表于 2013-3-27 22:25
首先 *(b_point)等于 Buffer[j];     
然后经过排序后*(b_point)正好就是中值
最后这就滤波了

*()
回复

使用道具 举报

1

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
威望
118
贡献
56
兑换币
75
注册时间
2012-12-16
在线时间
18 小时
毕业学校
浙江万里学院
4#
 楼主| 发表于 2013-3-29 15:44:08 | 只看该作者
zhl1122 发表于 2013-3-29 15:38
*()

*(b_point)=b这句语句放在第二个for语句里面,那不是每次j改变一个值,*(b_point)都被重新赋值,最后*(b_point)的值应该是最后一个j所得到的,那前面被赋值不是没有意义了吗?
回复

使用道具 举报

31

主题

1084

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5125

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章

威望
2630
贡献
1311
兑换币
922
注册时间
2011-5-8
在线时间
592 小时
5#
发表于 2013-3-29 17:48:29 | 只看该作者
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;
这个语句,你就懂了。
最后你会发现,哎呀,这段代码能滤波耶

回复

使用道具 举报

2

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
376
威望
164
贡献
78
兑换币
98
注册时间
2012-11-25
在线时间
67 小时
毕业学校
北京工业大学
6#
发表于 2013-4-2 22:31:01 | 只看该作者
简单的说就是 用调用指针的方法把该点、之前的点和之后的点都拿出来,然后排个序,把中间的值打出来附在该点上。
b_point是一个指针,b_point=&Buffer[i][j]指向的是你要算的点,*(b_point)=b是把那个中值赋予到你算的那个点上
回复

使用道具 举报

7

主题

92

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1345
威望
663
贡献
350
兑换币
299
注册时间
2012-7-9
在线时间
166 小时
7#
发表于 2013-4-23 10:20:36 | 只看该作者
搜罗的一些资料,呵呵
希望对楼主有用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

7

主题

92

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1345
威望
663
贡献
350
兑换币
299
注册时间
2012-7-9
在线时间
166 小时
8#
发表于 2013-4-23 10:59:34 | 只看该作者
自己做了一个简单的中值滤波的函数:
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的中值
很简单可以自己写几个数试试
回复

使用道具 举报

1

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
265
QQ
威望
138
贡献
79
兑换币
87
注册时间
2015-1-11
在线时间
24 小时
毕业学校
湖南大学
9#
发表于 2015-3-31 20:24:12 | 只看该作者
用调用指针的方法把该点、之前的点和之后的点都拿出来,然后排个序,把中间的值打出来附在该点上。
b_point是一个指针,b_point=&Buffer[i][j]指向的是你要算的点,*(b_point)=b是把那个中值赋予到你算的那个点上
回复

使用道具 举报

1

主题

6

帖子

0

精华

高级会员

Rank: 4

积分
507
威望
239
贡献
148
兑换币
151
注册时间
2018-10-1
在线时间
60 小时
10#
发表于 2018-11-4 20:35:27 | 只看该作者
用调用指针的方法把该点、之前的点和之后的点都拿出来,然后排个序,把中间的值打出来附在该点上。
b_point是一个指针,b_point=&Buffer[i][j]指向的是你要算的点,*(b_point)=b是把那个中值赋予到你算的那个点上
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|亿加合和智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-5-6 01:19 , Processed in 0.147906 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表