OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12875|回复: 37

关于摄像头寻边算法。canny算子

[复制链接]

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
发表于 2013-4-22 23:11:25 | 显示全部楼层 |阅读模式
最近弄一些摄像头然后通过算子(kirsch算子、canny算子等等)。。

kirsch算子和高斯滤波成功了,看下图。


原图。
 

高斯滤波  离散化滑窗卷积算法



kirsch算子 








但是kirsch算子会有边缘重复响应的问题,
所以采用canny算子,但是做好第一、二步  滤波和取幅度和方向之后再第三步卡住,算不了了。。想了好几天没进展,特此来请教兄弟们。


   Canny实在太难,请教各位兄弟。提个思路什么的。。

Canny边缘检测算法

 step1:用高斯滤波器平滑图象

 step2:用一阶偏导的有限差分来计算梯度的幅值和方向

 step3:对梯度幅值进行非极大值抑制

 step4:用双阈值算法检测和连接边缘

step1:高斯平滑函数

Step2:一阶微分卷积模板

step3:非极大值抑制

 仅仅得到全局的梯度并不足以确定边缘,因此为确定边缘,必须保留局部梯度最大的点,而抑制非极大值。(non-maxima suppression,NMS

解决方法:利用梯度的方向。


图1非极大值抑制

四个扇区的标号为03,对应3*3邻域的四种可能组合。在每一点上,邻域的中心象素M与沿着梯度线的两个象素相比。如果M的梯度值不比沿梯度线的两个相邻象素梯度值大,则令M=0

即: 

Step4:阈值化

 减少假边缘段数量的典型方法是对N[ij]使用一个阈值。将低于阈值的所有值赋零值。但问题是如何选取阈值?

 解决方法:双阈值算法。双阈值算法对非极大值抑制图象作用两个阈值τ1τ2,且2τ1≈τ2,从而可以得到两个阈值边缘图象N1i,j]和N2ij]。由于N2ij]使用高阈值得到,因而含有很少的假边缘,但有间断(不闭合)。双阈值法要在N2ij]中把边缘连接成轮廓,当到达轮廓的端点时,该算法就在N1i,j]的8邻点位置寻找可以连接到轮廓上的边缘,这样,算法不断地在 N1i,j]中收集边缘,直到将N2i,j]连接起来为止。

 前两步比较简单,实现的关键在于后两步。这里对第二步也概括的说一下,求纵横梯度的算子是很多的,像3×3的sobel算子,其卷积核是 [1,0,-1;1,0,-1;1,0,-1]和[1,1,1;0,0,0;-1,-1,-1];2×2的robert算子,其卷积核是 [1,-1;1,-1]和[1,1;-1,-1]。而我们学习matlab中canny检测的算法,在第一步滤波和第二步求纵横梯度时用的都是高斯模版。注意,滤波的模版系数之和为1,求梯度的模版系数之和为0,这是卷积模版的一个规律。我们滤波和求梯度的模版都是二维的高斯模版,但是用纵横2次两个一维的高斯卷积模版进行卷积可以达到和一个二维模版一样的效果,同时减小了总计算量,所以,在第一步滤波的时候我们用两个一维高斯模版代替一个二维高斯模版,但是第二步的高斯模版牵扯到梯度方向,所以还是用一个二维的高斯模版来直接卷积。

 第3步的非极大抑制要用到第2步得到的3个梯度图,其实第2步的“综合梯度图”已经可以看出图像边缘的轮廓了,只是边缘较粗且我们还没有对此梯度图上的边缘强度进行二值化(因为后面还有双阈值),这里的边缘含有大量的“假边缘”,它们的灰度值可能不如真边缘大,但是一个渐近的变化过程,非极大抑制的目的就是结合“梯度方向”和“梯度强度”去除这些“假边缘”。

 第4步的边缘连接,其实是强边缘到弱边缘的连接,我们经过第3步,得到一个二值化的“非极大抑制后的边缘图”,它和第二步得到的“综合梯度图”不同,一是去掉了大量伪边缘,二是它已经二值化了边缘灰度是统一的。这时,为什么我们还需要第4步?我在上面开始时的总结处说是为了进一步去除假边缘,这是有道理的,只不过这里的“假边缘”和第三步要去的“假边缘”性质不同,第3步处的假边缘可以理解成是真正依附在真边缘周围的假边缘(这样的边缘在第3步后就剩下很细的真边缘),甚至是依附在假边缘周围的假边缘(这样的边缘全是假边缘,经过第3步还会剩下一部分假边缘),两者中的后者正是第4步要处理的,第4步最重要的参数是两个自适应的阈值,所以说第4步对假边缘的鉴定是根据其灰度是否太弱来确定的(小于强阈值),而不是像第3步那样,鉴定的依据是其灰度值与周围灰度值的比较。在经由强阈值确定了真边缘后,再利用弱阈值对真边缘进行连接处理,以保证边缘的顺滑真实。注意,第4步的“连接方法”是自定义一个“染色的嵌套函数”来对一个点的8邻域点进行染色操作,这种编程方法对图像中具有相同性质(灰度值等)的联通区域进行染色操作是很有用的。

3. canny算法程序实现

 Canny算法程序中将上述的4个步骤再加以细分,分成以下7步:

生成高斯滤波系数;

用生成的高斯滤波系数对原图像进行平滑;

求滤波后图像的梯度;

进行非最大抑制;

l 统计图像的直方图,对阈值进行判定

利用函数寻找边界起点;

根据第6执行的结果,从一个像素点开始搜索,搜索以该像素点为边界起点的一条边界的一条边界的所有边界点;




希望有做过图像边缘寻找的朋友给个建议;



一直努力就很好。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

269

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2012-5-18
在线时间
6 小时
发表于 2014-3-28 12:44:04 | 显示全部楼层
效果这么差,建议你用其他算子。比如说Prewitt算子或者在做卷积之前对直方图均衡化处理。
谁来买我的火柴.....
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-23 00:15:04 | 显示全部楼层
不懂,帮顶
回复 支持 反对

使用道具 举报

2

主题

100

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2012-4-15
在线时间
0 小时
发表于 2013-4-23 08:37:17 | 显示全部楼层
顶!
回复 支持 反对

使用道具 举报

3

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-8-6
在线时间
0 小时
发表于 2013-4-24 03:17:49 | 显示全部楼层
好东西,帮顶。
回复 支持 反对

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
 楼主| 发表于 2013-4-25 12:25:33 | 显示全部楼层
谢谢你们,我来自己顶一下。。
一直努力就很好。
回复 支持 反对

使用道具 举报

1

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2010-12-14
在线时间
65 小时
发表于 2013-4-29 08:59:42 | 显示全部楼层
好东西,帮顶。
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-28
在线时间
1 小时
发表于 2013-4-30 12:09:02 | 显示全部楼层
哥们是做图像处理搞出检测图像,还是做机器人视觉让机器人能自主识别物体呢?
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2013-6-13
在线时间
1 小时
发表于 2013-6-14 10:20:13 | 显示全部楼层
顶一顶啊~~
回复 支持 反对

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
 楼主| 发表于 2013-6-14 10:34:14 | 显示全部楼层
回复【7楼】fdsa:
---------------------------------
机器人。
一直努力就很好。
回复 支持 反对

使用道具 举报

23

主题

143

帖子

1

精华

高级会员

Rank: 4

积分
933
金钱
933
注册时间
2012-4-23
在线时间
68 小时
发表于 2013-6-14 16:37:03 | 显示全部楼层
课有专门讲解各种算法的书推荐?
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2013-5-28
在线时间
0 小时
发表于 2013-8-21 17:12:22 | 显示全部楼层
楼主我最近也在弄图像,我有个512K的,但是我用原子哥的程序保存的话,只能申请一个大数组,在申请就说我超出范围了,所以我想请问下你的图像是怎么保存在SRAM的?多谢了
回复 支持 反对

使用道具 举报

10

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2013-12-5
在线时间
0 小时
发表于 2013-12-16 16:55:54 | 显示全部楼层
回复【11楼】xuefeiying:
-------------------------------
应该是用图像采集卡了吧,没有存在SRAM中
回复 支持 反对

使用道具 举报

1

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-11-8
在线时间
0 小时
发表于 2014-2-24 21:57:12 | 显示全部楼层
请问楼主,摄像头图像不过SRAM直接刷在液晶屏上挺好,通过DMA在SRAM中过一下,图像噪声就特别大,这是什么原因啊?怎么解决啊?先谢过了
回复 支持 反对

使用道具 举报

2

主题

3

帖子

0

精华

新手入门

积分
31
金钱
31
注册时间
2014-2-20
在线时间
0 小时
发表于 2014-2-28 23:40:37 | 显示全部楼层
请教下楼主,你的图像是怎么保存的呢?我开了两个60*80的数组就出问题了,芯片stm32f103rbt6。
“没有比人更高的山,没有比脚更长的路。”,“你是猴子请来的逗比吗?”
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2014-3-28 15:07:21 | 显示全部楼层
回复【15楼】古月:
---------------------------------
果然是专业的图像信号处理专家,顶~~~
回复 支持 反对

使用道具 举报

31

主题

269

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2012-5-18
在线时间
6 小时
发表于 2014-3-29 01:17:23 | 显示全部楼层
回复【16楼】lsj9383:
---------------------------------
信号处理大师见笑了。
谁来买我的火柴.....
回复 支持 反对

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-14
在线时间
0 小时
发表于 2014-5-19 23:16:43 | 显示全部楼层
回复【17楼】古月:
---------------------------------
回复【5楼】qq942266575:
---------------------------------
兄弟,有没有其他图像处理(比如边缘锐化呀、灰度直方图呀、图像分割呀等等)的代码,这是救命的举动呀,毕设用到
回复 支持 反对

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-14
在线时间
0 小时
发表于 2014-5-19 23:17:49 | 显示全部楼层
据对顶了,这是我们所求的
回复 支持 反对

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
 楼主| 发表于 2014-5-20 09:23:08 | 显示全部楼层
[mw_shl_code=c,true]//Kirsch ??×? ???í LCD_SetDisplayLayer(2); //?è???±?°???????? for(Xo=0;Xo<800;Xo++) { for(Yo=0;Yo<480;Yo++) { LCD_SetOperateLayer(0); //?è???±?°??×÷???? Clockwise=0; for(Yf=-1;Yf<2;Yf++) { // P0| P1|P2 //?????ò??????????????·????±?? for(Xf=-1;Xf<2;Xf++) // ----------- { // P3| P4|P5 Pa[Clockwise]=LCD_ReadPoint(Xo+Xf,Yo+Yf)&0x001f; // ----------- Clockwise++; // P6| P7|P8 } // } Q[0] = (5*(Pa[0]+Pa[1]+Pa[2]))-(3*(Pa[5]+Pa[8]+Pa[7]+Pa[6]+Pa[3])); Q[1] = (5*(Pa[0]+Pa[1]+Pa[3]))-(3*(Pa[2]+Pa[5]+Pa[8]+Pa[7]+Pa[6])); Q[2] = (5*(Pa[0]+Pa[3]+Pa[6]))-(3*(Pa[1]+Pa[2]+Pa[5]+Pa[8]+Pa[7])); Q[3] = (5*(Pa[3]+Pa[6]+Pa[7]))-(3*(Pa[0]+Pa[1]+Pa[2]+Pa[5]+Pa[8])); Q[4] = (5*(Pa[6]+Pa[7]+Pa[8]))-(3*(Pa[0]+Pa[1]+Pa[2]+Pa[3]+Pa[5])); Q[5] = (5*(Pa[5]+Pa[7]+Pa[8]))-(3*(Pa[0]+Pa[1]+Pa[2]+Pa[3]+Pa[6])); Q[6] = (5*(Pa[2]+Pa[5]+Pa[8]))-(3*(Pa[0]+Pa[1]+Pa[3]+Pa[6]+Pa[7])); Q[7] = (5*(Pa[1]+Pa[2]+Pa[5]))-(3*(Pa[0]+Pa[3]+Pa[6]+Pa[7]+Pa[8])); //?ó×??ó·??ò???????? max = (Q[0]>Q[1])?Q[0][1]; max = (max>Q[2])?max[2]; max = (max>Q[3])?max[3]; max = (max>Q[4])?max[4]; max = (max>Q[5])?max[5]; max = (max>Q[6])?max[6]; max = (max>Q[7])?max[7]; if(max<0) max=0; if(max>255) max=255; // if(max <= 15) max = BLACK; set = (u8)max; LCD_SetOperateLayer(2); //?è???±?°??×÷???? color = (set<<11)|(set<<6)|set; LCD_Fast_DrawPoint(Xo,Yo,color); } } [/mw_shl_code]

一直努力就很好。
回复 支持 反对

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-14
在线时间
0 小时
发表于 2014-5-20 10:40:23 | 显示全部楼层
回复【20楼】qq942266575:
---------------------------------
非常感谢,这是重要时刻
回复 支持 反对

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-14
在线时间
0 小时
发表于 2014-5-20 18:34:27 | 显示全部楼层
回复【20楼】qq942266575:
--------------------------------
兄弟,找ALIENTEK MiniSTM32开放板方面的大神弄了,但是他也调不出来,他没有用ALIENTEK MiniSTM32开放板研究过图像处理方面,所以,能否请求哥们发完整的kirsch算子代码呀!本人不胜感激,我的邮箱:1361191905@qq.com。谢谢!!!!!
回复 支持 反对

使用道具 举报

3

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-1-17
在线时间
0 小时
发表于 2014-5-20 19:15:54 | 显示全部楼层
回复【22楼】hyd:
---------------------------------
你应该找图像处理大神,而不是开发板大神、
1.先看看二维卷积的代码怎么写。
2.直接将算子带入二维卷积即可。
方向已经给你了。
回复 支持 反对

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-14
在线时间
0 小时
发表于 2014-5-20 19:30:00 | 显示全部楼层
回复【23楼】卧虎藏龙:
-------------------------------
找过了,它们不会ALIENTEK MiniSTM32开放板,而且,很多人都是只用软件(比如MATLAB)就调试好了,不用到硬件。
回复 支持 反对

使用道具 举报

3

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-1-17
在线时间
0 小时
发表于 2014-5-21 12:40:12 | 显示全部楼层
回复【24楼】hyd:
---------------------------------
那就自己写嘛。
回复 支持 反对

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-14
在线时间
0 小时
发表于 2014-5-21 13:35:01 | 显示全部楼层
回复【25楼】卧虎藏龙:
---------------------------------
回复【25楼】卧虎藏龙:
---------------------------------
好吧!!谢谢
回复 支持 反对

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-14
在线时间
0 小时
发表于 2014-5-22 17:56:39 | 显示全部楼层
回复【20楼】qq942266575:
---------------------------------
处理时,是对最少编码单元(MCU)进行kirsch算子处理吗?谢谢
回复 支持 反对

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-14
在线时间
0 小时
发表于 2014-5-22 21:15:17 | 显示全部楼层
回复【20楼】qq942266575:
---------------------------------
老兄,这中文注释都是什么意思呀
回复 支持 反对

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-14
在线时间
0 小时
发表于 2014-5-22 21:29:58 | 显示全部楼层
回复【5楼】qq942266575:
---------------------------------
楼主,还不上线,救命呀
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-2-15
在线时间
0 小时
发表于 2014-7-14 09:21:42 | 显示全部楼层
真在为图像处理要用的数组发难的  艰难飘过。。。
回复 支持 反对

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
 楼主| 发表于 2014-7-14 09:43:17 | 显示全部楼层
回复【29楼】hyd:
---------------------------------
回复【30楼】gsabcde:
---------------------------------
是啊是啊。
一直努力就很好。
回复 支持 反对

使用道具 举报

6

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
404
金钱
404
注册时间
2013-1-11
在线时间
107 小时
发表于 2014-7-16 08:42:17 | 显示全部楼层
回复【11楼】xuefeiying:
---------------------------------
能不能保存到液晶屏幕的存储中,用的时候从那里读取。还有什么更好的方法吗?
为啥还要考试啊。。。。。。。
回复 支持 反对

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
 楼主| 发表于 2014-7-16 13:19:30 | 显示全部楼层
回复【32楼】unciauncia:
---------------------------------
能,更好的方法你需要够大的RAM,要么就是SDRAM,会便宜点。
一直努力就很好。
回复 支持 反对

使用道具 举报

6

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
404
金钱
404
注册时间
2013-1-11
在线时间
107 小时
发表于 2014-7-16 20:51:44 | 显示全部楼层
回复【33楼】qq942266575:
--------------------------------
好吧,我现在还用不大那么大的存储
为啥还要考试啊。。。。。。。
回复 支持 反对

使用道具 举报

16

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2013-8-10
在线时间
0 小时
发表于 2014-7-25 22:03:44 | 显示全部楼层
群主,完整代码能发我一份吗?谢谢!
回复 支持 反对

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-10-6 10:13:39 | 显示全部楼层
请多多指教!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-4-29
在线时间
0 小时
发表于 2016-4-29 16:19:03 | 显示全部楼层
楼主有没有完整代码供我们小白瞻仰,,,在此谢过
回复 支持 反对

使用道具 举报

21

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2017-11-25
在线时间
80 小时
发表于 2018-9-6 20:04:36 | 显示全部楼层
楼主现在解决了嘛   非极大值抑制用线性插值法
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 15:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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