精华内容
下载资源
问答
  • harris角点检测代码

    热门讨论 2013-10-13 17:10:11
    附带两种harris角点检测代码,都可以使用matlab正常运行。第一种经典harris角点检测可以显示角点坐标,角点数量,运行时间。第二种harris是在第一种之上进行改进的代码,坐标可以显示到亚像素级别。两种代码都有很...
  • Susan角点检测代码

    热门讨论 2008-12-25 09:39:23
    数字图像处理Susan算法代码 用于角点检测 边缘检测 c文件编写
  • SUSAN 角点检测 matlab代码

    热门讨论 2014-12-17 21:12:44
    SUSAN 角点检测 matlab代码. 主代码是testSusan.m. 若读入图像格式不对,请自行修改
  • 角点检测matlab代码

    热门讨论 2009-07-03 09:08:30
    用于图像角点检测,基本的harris检测算法。
  • Moravec角点检测算法代码

    热门讨论 2012-11-14 17:15:26
    代码可用
  • 详解Harris角点检测代码实现

    万次阅读 多人点赞 2016-04-02 12:03:24
    1. 首先,我们不禁要问什么是harris角点?  对于角点,到目前为止还没有明确的数学定义。...一般的角点检测都是对有具体定义的、或者是能够具体检测出来的兴趣检测。这意味着兴趣可以是角点,是

    转自:http://blog.csdn.net/dandan_397/article/details/42110719


    1. 首先,我们不禁要问什么是harris角点?

           对于角点,到目前为止还没有明确的数学定义。但是你可以认为角点就是极值点,即在某方面属性特别突出的点。一般的角点检测都是对有具体定义的、或者是能够具体检测出来的兴趣点的检测。这意味着兴趣点可以是角点,是在某些属性上强度最大或者最小的孤立点、线段的终点,或者是曲线上局部曲率最大的点。

           通俗的来说,在一副图像中,我们可以认为角点是物体轮廓线的连接点(见图1),当拍摄视角变化的时候,这些特征点仍能很好地保持稳定的属性。

                                                     

                                                                     图1  corner

           角点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能。它的各种应用,这里我就不再赘述了。

    2. 如何检测出harris角点?

                                     

                                                             图2  角点检测的基本思想

           角点检测最原始的想法就是取某个像素的一个邻域窗口,当这个窗口在各个方向上进行小范围移动时,观察窗口内平均的像素灰度值的变化(即,E(u,v),Window-averaged change of intensity)。从上图可知,我们可以将一幅图像大致分为三个区域(‘flat’,‘edge’,‘corner’),这三个区域变化是不一样的。

                           

          其中,u,v是窗口在水平,竖直方向的偏移,

                         

          这里可以先简单复习一下泰勒级数展开的知识,因为马上就用到啦,


                

    这是一维的情况,对于多元函数,也有类似的泰勒公式。

           对I(x+u,y+v)进行二维泰勒级数展开,我们取一阶近似,有

                                        

            图中蓝线圈出的部分我们称之为结构张量(structure tensor),用M表示。

            讲到这里,先明确一点,我们的目的是什么?我们的目的是寻找这样的像素点,它使得我们的u,v无论怎样取值,E(u,v)都是变化比较大的,这个像素点就是我们要找的角点。不难观察,上式近似处理后的E(u,v)是一个二次型,而由下述定理可知,

                                

            令E(u,v)=常数,我们可用一个椭圆来描绘这一函数。

                                                    

             椭圆的长短轴是与结构张量M的两个特征值相对应的量。通过判断的情况我们就可以区分出‘flat’,‘edge’,‘corner’这三种区域,因为最直观的印象:

    corner:在水平、竖直两个方向上变化均较大的点,即Ix、Iy都较大; 
     edge :仅在水平、或者仅在竖直方向有较大的点,即Ix和Iy只有其一较大 ;
      flat   : 在水平、竖直方向的变化量均较小的点,即Ix、Iy都较小;

           而结构张量M是由Ix,Iy构成,它的特征值正好可以反映Ix,Iy的情况,下面我以一种更容易理解的方式来讲述椭圆的物理意义。

                              

                             

                             

             这样是不是更清楚了呢^_^......,因此我们可以得出结论:

                            

             当然,大牛们并没有止步于此,这样通过判断两个变量的值来判断角点毕竟不是很方便。于是他们想出了一种更好的方法,对,就是定义角点响应函数R(corner response function),

                                                

          针对三种区域,R的取值如何呢?

                            

                至此,我们就可以通过判断R的值来判断某个点是不是角点了。

    3. harris角点检测算法步骤

                   

            值得注意的是,在实际情况中,用来判断R的阈值依赖于实际图像的尺寸、纹理等因素,由于其不具有直观的物理意义,它的取值很难确定。通常我们采用间接的方法来判断R:通过选择图像中R值最大的前n个像素点作为特征点,再对提取到的特征点进行K*K邻域的非极大抑制处理就可以了。

    4. Matlab 代码实现

    <a target=_blank id="L1" href="http://blog.csdn.net/dandan_397/article/details/42110719#L1" rel="#L1" style="color: rgb(102, 102, 102); text-decoration: none;">  1</a>
    <a target=_blank id="L2" href="http://blog.csdn.net/dandan_397/article/details/42110719#L2" rel="#L2" style="color: rgb(102, 102, 102); text-decoration: none;">  2</a>
    <a target=_blank id="L3" href="http://blog.csdn.net/dandan_397/article/details/42110719#L3" rel="#L3" style="color: rgb(102, 102, 102); text-decoration: none;">  3</a>
    <a target=_blank id="L4" href="http://blog.csdn.net/dandan_397/article/details/42110719#L4" rel="#L4" style="color: rgb(102, 102, 102); text-decoration: none;">  4</a>
    <a target=_blank id="L5" href="http://blog.csdn.net/dandan_397/article/details/42110719#L5" rel="#L5" style="color: rgb(102, 102, 102); text-decoration: none;">  5</a>
    <a target=_blank id="L6" href="http://blog.csdn.net/dandan_397/article/details/42110719#L6" rel="#L6" style="color: rgb(102, 102, 102); text-decoration: none;">  6</a>
    <a target=_blank id="L7" href="http://blog.csdn.net/dandan_397/article/details/42110719#L7" rel="#L7" style="color: rgb(102, 102, 102); text-decoration: none;">  7</a>
    <a target=_blank id="L8" href="http://blog.csdn.net/dandan_397/article/details/42110719#L8" rel="#L8" style="color: rgb(102, 102, 102); text-decoration: none;">  8</a>
    <a target=_blank id="L9" href="http://blog.csdn.net/dandan_397/article/details/42110719#L9" rel="#L9" style="color: rgb(102, 102, 102); text-decoration: none;">  9</a>
    <a target=_blank id="L10" href="http://blog.csdn.net/dandan_397/article/details/42110719#L10" rel="#L10" style="color: rgb(102, 102, 102); text-decoration: none;"> 10</a>
    <a target=_blank id="L11" href="http://blog.csdn.net/dandan_397/article/details/42110719#L11" rel="#L11" style="color: rgb(102, 102, 102); text-decoration: none;"> 11</a>
    <a target=_blank id="L12" href="http://blog.csdn.net/dandan_397/article/details/42110719#L12" rel="#L12" style="color: rgb(102, 102, 102); text-decoration: none;"> 12</a>
    <a target=_blank id="L13" href="http://blog.csdn.net/dandan_397/article/details/42110719#L13" rel="#L13" style="color: rgb(102, 102, 102); text-decoration: none;"> 13</a>
    <a target=_blank id="L14" href="http://blog.csdn.net/dandan_397/article/details/42110719#L14" rel="#L14" style="color: rgb(102, 102, 102); text-decoration: none;"> 14</a>
    <a target=_blank id="L15" href="http://blog.csdn.net/dandan_397/article/details/42110719#L15" rel="#L15" style="color: rgb(102, 102, 102); text-decoration: none;"> 15</a>
    <a target=_blank id="L16" href="http://blog.csdn.net/dandan_397/article/details/42110719#L16" rel="#L16" style="color: rgb(102, 102, 102); text-decoration: none;"> 16</a>
    <a target=_blank id="L17" href="http://blog.csdn.net/dandan_397/article/details/42110719#L17" rel="#L17" style="color: rgb(102, 102, 102); text-decoration: none;"> 17</a>
    <a target=_blank id="L18" href="http://blog.csdn.net/dandan_397/article/details/42110719#L18" rel="#L18" style="color: rgb(102, 102, 102); text-decoration: none;"> 18</a>
    <a target=_blank id="L19" href="http://blog.csdn.net/dandan_397/article/details/42110719#L19" rel="#L19" style="color: rgb(102, 102, 102); text-decoration: none;"> 19</a>
    <a target=_blank id="L20" href="http://blog.csdn.net/dandan_397/article/details/42110719#L20" rel="#L20" style="color: rgb(102, 102, 102); text-decoration: none;"> 20</a>
    <a target=_blank id="L21" href="http://blog.csdn.net/dandan_397/article/details/42110719#L21" rel="#L21" style="color: rgb(102, 102, 102); text-decoration: none;"> 21</a>
    <a target=_blank id="L22" href="http://blog.csdn.net/dandan_397/article/details/42110719#L22" rel="#L22" style="color: rgb(102, 102, 102); text-decoration: none;"> 22</a>
    <a target=_blank id="L23" href="http://blog.csdn.net/dandan_397/article/details/42110719#L23" rel="#L23" style="color: rgb(102, 102, 102); text-decoration: none;"> 23</a>
    <a target=_blank id="L24" href="http://blog.csdn.net/dandan_397/article/details/42110719#L24" rel="#L24" style="color: rgb(102, 102, 102); text-decoration: none;"> 24</a>
    <a target=_blank id="L25" href="http://blog.csdn.net/dandan_397/article/details/42110719#L25" rel="#L25" style="color: rgb(102, 102, 102); text-decoration: none;"> 25</a>
    <a target=_blank id="L26" href="http://blog.csdn.net/dandan_397/article/details/42110719#L26" rel="#L26" style="color: rgb(102, 102, 102); text-decoration: none;"> 26</a>
    <a target=_blank id="L27" href="http://blog.csdn.net/dandan_397/article/details/42110719#L27" rel="#L27" style="color: rgb(102, 102, 102); text-decoration: none;"> 27</a>
    <a target=_blank id="L28" href="http://blog.csdn.net/dandan_397/article/details/42110719#L28" rel="#L28" style="color: rgb(102, 102, 102); text-decoration: none;"> 28</a>
    <a target=_blank id="L29" href="http://blog.csdn.net/dandan_397/article/details/42110719#L29" rel="#L29" style="color: rgb(102, 102, 102); text-decoration: none;"> 29</a>
    <a target=_blank id="L30" href="http://blog.csdn.net/dandan_397/article/details/42110719#L30" rel="#L30" style="color: rgb(102, 102, 102); text-decoration: none;"> 30</a>
    <a target=_blank id="L31" href="http://blog.csdn.net/dandan_397/article/details/42110719#L31" rel="#L31" style="color: rgb(102, 102, 102); text-decoration: none;"> 31</a>
    <a target=_blank id="L32" href="http://blog.csdn.net/dandan_397/article/details/42110719#L32" rel="#L32" style="color: rgb(102, 102, 102); text-decoration: none;"> 32</a>
    <a target=_blank id="L33" href="http://blog.csdn.net/dandan_397/article/details/42110719#L33" rel="#L33" style="color: rgb(102, 102, 102); text-decoration: none;"> 33</a>
    <a target=_blank id="L34" href="http://blog.csdn.net/dandan_397/article/details/42110719#L34" rel="#L34" style="color: rgb(102, 102, 102); text-decoration: none;"> 34</a>
    <a target=_blank id="L35" href="http://blog.csdn.net/dandan_397/article/details/42110719#L35" rel="#L35" style="color: rgb(102, 102, 102); text-decoration: none;"> 35</a>
    <a target=_blank id="L36" href="http://blog.csdn.net/dandan_397/article/details/42110719#L36" rel="#L36" style="color: rgb(102, 102, 102); text-decoration: none;"> 36</a>
    <a target=_blank id="L37" href="http://blog.csdn.net/dandan_397/article/details/42110719#L37" rel="#L37" style="color: rgb(102, 102, 102); text-decoration: none;"> 37</a>
    <a target=_blank id="L38" href="http://blog.csdn.net/dandan_397/article/details/42110719#L38" rel="#L38" style="color: rgb(102, 102, 102); text-decoration: none;"> 38</a>
    <a target=_blank id="L39" href="http://blog.csdn.net/dandan_397/article/details/42110719#L39" rel="#L39" style="color: rgb(102, 102, 102); text-decoration: none;"> 39</a>
    <a target=_blank id="L40" href="http://blog.csdn.net/dandan_397/article/details/42110719#L40" rel="#L40" style="color: rgb(102, 102, 102); text-decoration: none;"> 40</a>
    <a target=_blank id="L41" href="http://blog.csdn.net/dandan_397/article/details/42110719#L41" rel="#L41" style="color: rgb(102, 102, 102); text-decoration: none;"> 41</a>
    <a target=_blank id="L42" href="http://blog.csdn.net/dandan_397/article/details/42110719#L42" rel="#L42" style="color: rgb(102, 102, 102); text-decoration: none;"> 42</a>
    <a target=_blank id="L43" href="http://blog.csdn.net/dandan_397/article/details/42110719#L43" rel="#L43" style="color: rgb(102, 102, 102); text-decoration: none;"> 43</a>
    <a target=_blank id="L44" href="http://blog.csdn.net/dandan_397/article/details/42110719#L44" rel="#L44" style="color: rgb(102, 102, 102); text-decoration: none;"> 44</a>
    <a target=_blank id="L45" href="http://blog.csdn.net/dandan_397/article/details/42110719#L45" rel="#L45" style="color: rgb(102, 102, 102); text-decoration: none;"> 45</a>
    <a target=_blank id="L46" href="http://blog.csdn.net/dandan_397/article/details/42110719#L46" rel="#L46" style="color: rgb(102, 102, 102); text-decoration: none;"> 46</a>
    <a target=_blank id="L47" href="http://blog.csdn.net/dandan_397/article/details/42110719#L47" rel="#L47" style="color: rgb(102, 102, 102); text-decoration: none;"> 47</a>
    <a target=_blank id="L48" href="http://blog.csdn.net/dandan_397/article/details/42110719#L48" rel="#L48" style="color: rgb(102, 102, 102); text-decoration: none;"> 48</a>
    <a target=_blank id="L49" href="http://blog.csdn.net/dandan_397/article/details/42110719#L49" rel="#L49" style="color: rgb(102, 102, 102); text-decoration: none;"> 49</a>
    <a target=_blank id="L50" href="http://blog.csdn.net/dandan_397/article/details/42110719#L50" rel="#L50" style="color: rgb(102, 102, 102); text-decoration: none;"> 50</a>
    <a target=_blank id="L51" href="http://blog.csdn.net/dandan_397/article/details/42110719#L51" rel="#L51" style="color: rgb(102, 102, 102); text-decoration: none;"> 51</a>
    <a target=_blank id="L52" href="http://blog.csdn.net/dandan_397/article/details/42110719#L52" rel="#L52" style="color: rgb(102, 102, 102); text-decoration: none;"> 52</a>
    <a target=_blank id="L53" href="http://blog.csdn.net/dandan_397/article/details/42110719#L53" rel="#L53" style="color: rgb(102, 102, 102); text-decoration: none;"> 53</a>
    <a target=_blank id="L54" href="http://blog.csdn.net/dandan_397/article/details/42110719#L54" rel="#L54" style="color: rgb(102, 102, 102); text-decoration: none;"> 54</a>
    <a target=_blank id="L55" href="http://blog.csdn.net/dandan_397/article/details/42110719#L55" rel="#L55" style="color: rgb(102, 102, 102); text-decoration: none;"> 55</a>
    <a target=_blank id="L56" href="http://blog.csdn.net/dandan_397/article/details/42110719#L56" rel="#L56" style="color: rgb(102, 102, 102); text-decoration: none;"> 56</a>
    <a target=_blank id="L57" href="http://blog.csdn.net/dandan_397/article/details/42110719#L57" rel="#L57" style="color: rgb(102, 102, 102); text-decoration: none;"> 57</a>
    <a target=_blank id="L58" href="http://blog.csdn.net/dandan_397/article/details/42110719#L58" rel="#L58" style="color: rgb(102, 102, 102); text-decoration: none;"> 58</a>
    <a target=_blank id="L59" href="http://blog.csdn.net/dandan_397/article/details/42110719#L59" rel="#L59" style="color: rgb(102, 102, 102); text-decoration: none;"> 59</a>
    <a target=_blank id="L60" href="http://blog.csdn.net/dandan_397/article/details/42110719#L60" rel="#L60" style="color: rgb(102, 102, 102); text-decoration: none;"> 60</a>
    <a target=_blank id="L61" href="http://blog.csdn.net/dandan_397/article/details/42110719#L61" rel="#L61" style="color: rgb(102, 102, 102); text-decoration: none;"> 61</a>
    <a target=_blank id="L62" href="http://blog.csdn.net/dandan_397/article/details/42110719#L62" rel="#L62" style="color: rgb(102, 102, 102); text-decoration: none;"> 62</a>
    <a target=_blank id="L63" href="http://blog.csdn.net/dandan_397/article/details/42110719#L63" rel="#L63" style="color: rgb(102, 102, 102); text-decoration: none;"> 63</a>
    <a target=_blank id="L64" href="http://blog.csdn.net/dandan_397/article/details/42110719#L64" rel="#L64" style="color: rgb(102, 102, 102); text-decoration: none;"> 64</a>
    <a target=_blank id="L65" href="http://blog.csdn.net/dandan_397/article/details/42110719#L65" rel="#L65" style="color: rgb(102, 102, 102); text-decoration: none;"> 65</a>
    <a target=_blank id="L66" href="http://blog.csdn.net/dandan_397/article/details/42110719#L66" rel="#L66" style="color: rgb(102, 102, 102); text-decoration: none;"> 66</a>
    <a target=_blank id="L67" href="http://blog.csdn.net/dandan_397/article/details/42110719#L67" rel="#L67" style="color: rgb(102, 102, 102); text-decoration: none;"> 67</a>
    <a target=_blank id="L68" href="http://blog.csdn.net/dandan_397/article/details/42110719#L68" rel="#L68" style="color: rgb(102, 102, 102); text-decoration: none;"> 68</a>
    <a target=_blank id="L69" href="http://blog.csdn.net/dandan_397/article/details/42110719#L69" rel="#L69" style="color: rgb(102, 102, 102); text-decoration: none;"> 69</a>
    <a target=_blank id="L70" href="http://blog.csdn.net/dandan_397/article/details/42110719#L70" rel="#L70" style="color: rgb(102, 102, 102); text-decoration: none;"> 70</a>
    <a target=_blank id="L71" href="http://blog.csdn.net/dandan_397/article/details/42110719#L71" rel="#L71" style="color: rgb(102, 102, 102); text-decoration: none;"> 71</a>
    <a target=_blank id="L72" href="http://blog.csdn.net/dandan_397/article/details/42110719#L72" rel="#L72" style="color: rgb(102, 102, 102); text-decoration: none;"> 72</a>
    <a target=_blank id="L73" href="http://blog.csdn.net/dandan_397/article/details/42110719#L73" rel="#L73" style="color: rgb(102, 102, 102); text-decoration: none;"> 73</a>
    <a target=_blank id="L74" href="http://blog.csdn.net/dandan_397/article/details/42110719#L74" rel="#L74" style="color: rgb(102, 102, 102); text-decoration: none;"> 74</a>
    <a target=_blank id="L75" href="http://blog.csdn.net/dandan_397/article/details/42110719#L75" rel="#L75" style="color: rgb(102, 102, 102); text-decoration: none;"> 75</a>
    <a target=_blank id="L76" href="http://blog.csdn.net/dandan_397/article/details/42110719#L76" rel="#L76" style="color: rgb(102, 102, 102); text-decoration: none;"> 76</a>
    <a target=_blank id="L77" href="http://blog.csdn.net/dandan_397/article/details/42110719#L77" rel="#L77" style="color: rgb(102, 102, 102); text-decoration: none;"> 77</a>
    <a target=_blank id="L78" href="http://blog.csdn.net/dandan_397/article/details/42110719#L78" rel="#L78" style="color: rgb(102, 102, 102); text-decoration: none;"> 78</a>
    <a target=_blank id="L79" href="http://blog.csdn.net/dandan_397/article/details/42110719#L79" rel="#L79" style="color: rgb(102, 102, 102); text-decoration: none;"> 79</a>
    <a target=_blank id="L80" href="http://blog.csdn.net/dandan_397/article/details/42110719#L80" rel="#L80" style="color: rgb(102, 102, 102); text-decoration: none;"> 80</a>
    <a target=_blank id="L81" href="http://blog.csdn.net/dandan_397/article/details/42110719#L81" rel="#L81" style="color: rgb(102, 102, 102); text-decoration: none;"> 81</a>
    <a target=_blank id="L82" href="http://blog.csdn.net/dandan_397/article/details/42110719#L82" rel="#L82" style="color: rgb(102, 102, 102); text-decoration: none;"> 82</a>
    <a target=_blank id="L83" href="http://blog.csdn.net/dandan_397/article/details/42110719#L83" rel="#L83" style="color: rgb(102, 102, 102); text-decoration: none;"> 83</a>
    <a target=_blank id="L84" href="http://blog.csdn.net/dandan_397/article/details/42110719#L84" rel="#L84" style="color: rgb(102, 102, 102); text-decoration: none;"> 84</a>
    <a target=_blank id="L85" href="http://blog.csdn.net/dandan_397/article/details/42110719#L85" rel="#L85" style="color: rgb(102, 102, 102); text-decoration: none;"> 85</a>
    <a target=_blank id="L86" href="http://blog.csdn.net/dandan_397/article/details/42110719#L86" rel="#L86" style="color: rgb(102, 102, 102); text-decoration: none;"> 86</a>
    <a target=_blank id="L87" href="http://blog.csdn.net/dandan_397/article/details/42110719#L87" rel="#L87" style="color: rgb(102, 102, 102); text-decoration: none;"> 87</a>
    <a target=_blank id="L88" href="http://blog.csdn.net/dandan_397/article/details/42110719#L88" rel="#L88" style="color: rgb(102, 102, 102); text-decoration: none;"> 88</a>
    <a target=_blank id="L89" href="http://blog.csdn.net/dandan_397/article/details/42110719#L89" rel="#L89" style="color: rgb(102, 102, 102); text-decoration: none;"> 89</a>
    <a target=_blank id="L90" href="http://blog.csdn.net/dandan_397/article/details/42110719#L90" rel="#L90" style="color: rgb(102, 102, 102); text-decoration: none;"> 90</a>
    <a target=_blank id="L91" href="http://blog.csdn.net/dandan_397/article/details/42110719#L91" rel="#L91" style="color: rgb(102, 102, 102); text-decoration: none;"> 91</a>
    <a target=_blank id="L92" href="http://blog.csdn.net/dandan_397/article/details/42110719#L92" rel="#L92" style="color: rgb(102, 102, 102); text-decoration: none;"> 92</a>
    <a target=_blank id="L93" href="http://blog.csdn.net/dandan_397/article/details/42110719#L93" rel="#L93" style="color: rgb(102, 102, 102); text-decoration: none;"> 93</a>
    <a target=_blank id="L94" href="http://blog.csdn.net/dandan_397/article/details/42110719#L94" rel="#L94" style="color: rgb(102, 102, 102); text-decoration: none;"> 94</a>
    clear;
    % ori_im =double(imread('lena.jpg')); % 读取图像
    ori_im = imread('pig.jpg');
    % ori_im = imread('Baboon.bmp');
    % figure,
    % imshow(ori_im),
    % title('the original image')
    ori_gray = rgb2gray(ori_im);
    % fx = [5 0 -5;8 0 -8;5 0 -5]; % 高斯函数一阶微分,x方向(用于改进的Harris角点提取算法)
    fx = [-2 -1 0 1 2]; % x方向梯度算子(用于Harris角点提取算法)
    Ix = filter2(fx,ori_gray); % x方向滤波
    % fy = [5 8 5;0 0 0;-5 -8 -5]; % 高斯函数一阶微分,y方向(用于改进的Harris角点提取算法)
    fy = [-2;-1;0;1;2]; % y方向梯度算子(用于Harris角点提取算法)
    Iy = filter2(fy,ori_gray); % y方向滤波
    Ix2 = Ix.^2;
    Iy2 = Iy.^2;
    Ixy = Ix.*Iy;
    clear Ix;
    clear Iy;
    %% 考虑到图像一般情况下的噪声影响,采用高斯滤波去除噪声点
    h= fspecial('gaussian',[7 7],2); % 产生7*7的高斯窗函数,sigma=2
    Ix2 = filter2(h,Ix2);
    Iy2 = filter2(h,Iy2);
    Ixy = filter2(h,Ixy);
    height = size(ori_gray,1);
    width = size(ori_gray,2);
    result = zeros(height,width); % 纪录角点位置,角点处值为1
    %% 计算角点的响应函数R(即用一个值来衡量这个点是否是角点),并标记角点(R(i,j)>0.01*Rmax,且R(i,j)为3x3邻域局部最大值)
    k=1;
    lambda=zeros(height*width,2);
    R = zeros(height,width);
    for i = 1:height
    for j = 1:width
    M = [Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)]; % auto correlation matrix
    K = det(M); %求行列式
    H = trace(M); %求迹
    % R(i,j) = det(M)-0.06*(trace(M))^2;
    R(i,j) = K-0.06*H^2;
    lambda(k,:)=[K H];
    k=k+1;
    end;
    end;
    figure,
    plot(lambda(:,1),lambda(:,2),'.');
    ylabel('trace');xlabel('det');
    %%
    cnt = 0;
    for i = 2:height-1
    for j = 2:width-1
    % 进行非极大抑制,窗口大小3*3
    if R(i,j) > R(i-1,j-1) && R(i,j) > R(i-1,j) && R(i,j) > R(i-1,j+1) && R(i,j) > R(i,j-1) && R(i,j) > R(i,j+1) && R(i,j) > R(i+1,j-1) && R(i,j) > R(i+1,j) && R(i,j) > R(i+1,j+1)
    result(i,j) = 1;
    cnt = cnt+1;
    end;
    end;
    end;
    Rsort=zeros(cnt,1);
    [posr, posc] = find(result == 1);
    for i=1:cnt
    Rsort(i)=R(posr(i),posc(i));
    end;
    [Rsort,ix]=sort(Rsort,1);
    Rsort=flipud(Rsort);
    ix=flipud(ix);
    ps=120;
    posr2=zeros(ps,1);
    posc2=zeros(ps,1);
    pos=zeros(ps,1);
    for i=1:ps
    posr2(i)=posr(ix(i));
    posc2(i)=posc(ix(i));
    pos(i)= (posr2(i)-1)*width+posc2(i);
    end;
    hold on,
    plot(lambda(pos,1),lambda(pos,2),'r*');
    legend('flat & edges','corners')
    figure,
    imshow(ori_im);
    hold on;
    plot(posc2,posr2,'g.');
     来自CODE的代码片
    harris.m

    实验结果:

                                           

          再附一张中间结果图,det(M) 与trace(M)的分布图,便于大家更好地理解R,

                                          

          我在上面做了一些标记,

                                        


                欢迎大家一起学习交流!


      C.Harris, M.Stephens. “A Combined Corner and Edge Detector”. 1988


    展开全文
  • OpenCV的角点检测 C++代码

    千次阅读 2018-11-08 10:27:40
    下面有角点检测的全部代码,不过这个之前需要配置一下OpenCV的环境 我前边的博文中转发的有关于OpenCV环境的配置,没有配置过的可以去看一下 下边直接上代码 也是为了方便自己下次使用 代码如下: #include "...

    项目中有用到OpenCV,最近几天去着手学习了一下。
    下面有角点检测的全部代码,不过这个之前需要配置一下OpenCV的环境
    我前边的博文中转发的有关于OpenCV环境的配置,没有配置过的可以去看一下
    下边直接上代码 也是为了方便自己下次使用
    代码如下:

    #include "pch.h"
    #include <iostream>
    #include<string>  
    #include <limits>  
    #include <iomanip>
    #include <opencv2/opencv.hpp>
        
    using namespace std;
    using namespace cv;
    using std::setw;
    
    Mat src, gray_src;
    int thresh = 130;
    int max_count = 255;
    const char* output_title = "HarrisCornerDetectionResult";
    void Harris_Dome(int,void*);
    
    int main()
    {
    #pragma region OpenCV 角点检测
    	src = imread("F:/BeautifulPiture/aboutLove.jpg");
    	if (src.empty())
    	{
    		printf("没有发现图片!!!");
    		return -1;
    	}
    	namedWindow("Input image",CV_WINDOW_AUTOSIZE);
    	imshow("Input image",src);
    
    	namedWindow(output_title, CV_WINDOW_AUTOSIZE);//设置窗口大小
    	cvtColor(src,gray_src,COLOR_BGR2GRAY);//原图转换为灰度图
    	createTrackbar("Threshold",output_title,&thresh,max_count,Harris_Dome);//创建滑动条
    	Harris_Dome(0,0);
    	waitKey(0);
    #pragma endregion
    
    	//system("PAUSE");//停留等待 按任意键结束
    	return 0;
    
    }
    
    //角点检测函数
    void Harris_Dome(int,void*)
    {
    	Mat dst, norm_dst, normScaleDsr;
    	dst = Mat::zeros(gray_src.size(),CV_32FC1);
    
    	int blockSize = 2;
    	int Ksize = 3;
    	double k = 0.04;
    	cornerHarris(gray_src,dst,blockSize,Ksize,k,BORDER_DEFAULT);
    	normalize(dst,norm_dst,0,255,NORM_MINMAX,CV_32FC1,Mat());//归一化
    	convertScaleAbs(norm_dst,normScaleDsr);
    	
    	Mat resultImg = src.clone();
    	for (int row = 0; row < resultImg.rows; row++)
    	{
    		uchar* currenrRow = normScaleDsr.ptr(row);
    		for (int col = 0; col < resultImg.cols; col++)
    		{
    			int value = (int)* currenrRow;
    			if (value>thresh)
    			{
    				circle(resultImg,Point(col,row),2,Scalar(0,0,255),2,8,0);
    			}
    			currenrRow++;
    		}
    	}
    	imshow(output_title,resultImg);
    }
    
    展开全文
  • 针对图像的Susan角点检测算法,该代码写得非常稳健,我处理非常大的遥感图像,反复调用都不会出任何问题,相信对你有所帮助,我会及时共享我的最新代码,共同学习,共同交流,共同进步
  • Harris、SUSAN角点检测Matlab源代码

    千次阅读 多人点赞 2017-05-10 19:15:38
    角点检测主要运用于运动检测、图像匹配、视频跟踪、三维建模、目标识别。常用的几种基于灰度变化的算法有Moravec、Harris、SUSAN等,本文主要是对Harris和SUSAN方法进行源代码的展示,由于Matlab集成的库比较多,就...

      角点检测主要运用于运动检测、图像匹配、视频跟踪、三维建模、目标识别。常用的几种基于灰度变化的算法有K.R,Harris,KLT,SUSAN,MORAVEC。

          

    =

      由于以下缺点,Moverac渐渐被Harris取代  
     

    Moravecmin(SSD)

    1.Harris角点检测  

      Harris角点检测的思路较为清晰,其原理主要是找取双边变化最大的点,主要在于理解其响应值(评价灰度变化情况)函数的构造。当然虽说不难,但也是找了一大堆资料才看明白的。原本是打算自己写一遍,但发现有几篇博客里面介绍的已经不能再详细了,以下是传送门:http://www.cnblogs.com/ronny/p/4009425.html
      以下介绍一下Matlab实现的Harris角点检测,具体步骤都标注好了,大家可以对照着博客中的原理进行理解、
      

    clear; 
    % 读取图像 
    grayImage = imread('C:\Users\Administrator\Desktop\3.bmp');     
    % 转化为灰度图像
    %grayImage=rgb2gray(srcImage);
    % 求取图像宽高
    [ImageHeight,ImageWidth]=size(grayImage);
    % 显示原始灰度图
    %imshow(ori_im);
    % 方法1:x方向梯度算子(用于Harris角点提取算法) 
    fx = [-2 -1 0 1 2];
    % 方法2:x方向高斯卷积核(高斯尺度空间的多尺度优化)
    %fx = [5 0 -5;8 0 -8;5 0 -5]; 
    % x方向滤波微分
    Ix = filter2(fx,grayImage);            
    % 显示x方向滤波图
    %figure;imshow(Ix);
    % 方法1:y方向梯度算子(用于Harris角点提取算法) 
    fy = [-2;-1;0;1;2];      
    % 方法2:y方向高斯卷积核(高斯尺度空间的多尺度优化)
     %fy = [5 8 5;0 0 0;-5 -8 -5];
    % y方向滤波微分
    Iy = filter2(fy,grayImage);
    % 显示y方向滤波图
    figure;imshow(Iy);
    %(相关参数说明见harris理论,文中前面有链接)
    Ix2 = Ix.^2; 
    Iy2 = Iy.^2; 
    Ixy = Ix.*Iy; 
    % 产生7*7的高斯窗函数,sigma=2,用于窗口的高斯平滑 
    w= fspecial('gaussian',[7 7],2);      
    Ix2 = filter2(w,Ix2); 
    Iy2 = filter2(w,Iy2); 
    Ixy = filter2(w,Ixy); 
    % 纪录角点位置,角点处值为1 
    corner = zeros(ImageHeight,ImageWidth);
    % 图像中最大的响应值 
    Rmax = 0;                               
    % 计算各点的响应值
    R = zeros(ImageHeight,ImageWidth); 
    for i = 1:ImageHeight 
        for j = 1:ImageWidth 
            M = [Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)];             
            R(i,j) = det(M)-0.06*(trace(M))^2;                      
            if R(i,j) > Rmax 
                Rmax = R(i,j); 
            end; 
        end; 
    end; 
    % 角点个数
    cnt = 0; 
    % 进行非极大抑制,窗口大小3*3 
    for i = 2:ImageHeight-1 
        for j = 2:ImageWidth-1 
            if ( R(i,j) > 0.01*Rmax && R(i,j) > R(i-1,j-1) && R(i,j) > R(i-1,j) && R(i,j) > R(i-1,j+1) && R(i,j) > R(i,j-1) && R(i,j) > R(i,j+1) && R(i,j) > R(i+1,j-1) && R(i,j) > R(i+1,j) && R(i,j) > R(i+1,j+1)) 
                corner(i,j) = 1; 
                cnt = cnt+1; 
            end; 
        end; 
    end; 
    [upix, vpix] = find(corner == 1); 
    %角点个数
    cnt      
    %绘制角点
    figure;
    imshow(grayImage)
    hold on;
    plot(vpix,upix,'r.');      

    得到结果如下图
    这里写图片描述这里写图片描述

    2.SUSAN角点检测

    SUSAN算法容易把边缘也提取出来,但对噪声的容忍度比较强。
    原理参考http://blog.csdn.net/tostq/article/details/49305615

    clear;
    clc;
    % 读取图像
    Image=imread('C:\Users\Administrator\Desktop\1.bmp');
    % 转化为灰度图像
    %Image=rgb2gray(Image);
    % 显示图像
    %imshow(Image);
    % 获取图像高宽(行烈)
    [ImageHeight,ImageWidth]=size(Image);
    % 这一步没太大必要
    %Image=double(Image);
    % 判断灰度相近的阈值
    threshold=45;  
    % 当前像素和窗体内像素差别在t以下的个数,即相似的个数
    usan=[];
    % 计算以像素为中心的窗体内包含的
    % 包含37个像素的圆窗口,面积为12*pi=37,因此是以sqrt(12)为半径的原
    % 没有在外围扩展图像,最终图像会缩小
    for i=4:ImageHeight-3         
       for j=4:ImageWidth-3 
            %从原图中截取7*7的区域再在其中挑选圆窗
            tmp=Image(i-3:i+3,j-3:j+3);  
            %c表示灰度值相近的程度,越大越相近
            c=0;
            for p=1:7
               for q=1:7
                   %在7*7的区域中选取圆窗包含的像素
                    if (p-4)^2+(q-4)^2<=12 
                        %usan(k)=usan(k)+exp(-(((img(i,j)-tmp(p,q))/t)^6));
                        %判断灰度是否相近,t是自己设置的
                        if abs(Image(i,j)-tmp(p,q))<threshold  
                            c=c+1;
                        end
                    end
               end
            end
            usan=[usan c];
       end
    end
    %相当于进一步调整阈值,在threshold的基础上进一步减少角点个数
    g=2*max(usan)/3;
    for i=1:length(usan)
       if usan(i)<g 
           usan(i)=g-usan(i);
       else
           usan(i)=0;
       end
    end
    % 由于usan是一维的,所以要重新变换为二维,对应图像位置
    imgn=reshape(usan,[ImageWidth-6,ImageHeight-6])';
    %figure;
    %imshow(imgn)
    %非极大抑制
    [m n]=size(imgn);
    re=zeros(m,n);
    for i=2:m-1
       for j=2:n-1 
            if imgn(i,j)>max([max(imgn(i-1,j-1:j+1)) imgn(i,j-1) imgn(i,j+1) max(imgn(i+1,j-1:j+1))]);
                re(i,j)=1;
            else
                re(i,j)=0;
            end
       end
    end
    figure;
    imshow(Image)
    hold on;
    [x,y]=find(re==1);
    plot(y,x,'*')

    “`c

    效果图如下
    这里写图片描述

    展开全文
  • 角点是图像亮度发生剧烈变化和图像边缘曲线上曲率极大值,是目前很多图像关键提取算法的基础,也是研究物体移动时可选取的参考。本文主要记录Harris角点检测步骤,并对OpenCV1.0的代码进行分析。

    角点是图像亮度发生剧烈变化和图像边缘曲线上曲率极大值点,是目前很多图像关键点提取算法的基础,也是研究物体移动时可选取的参考点。本文主要记录Harris角点检测步骤,并对OpenCV1.0的代码进行分析。

    一、理论知识

    Harris角点的理论请参考【Harris角点】,这里只总结一下:

    1. 自相关函数由一阶泰勒展开后可近似成一个二次项函数,[Δx,Δy]M(x,y)[ΔxΔy]
    2. 研究M(x,y)决定的椭圆,发现角点的短轴和长轴值都比较大,且相互接近,可形式化为 detMα(traceM)2>Rt

    Harris的一些性质

    1. 对亮度和对比度的变化不敏感;
    2. 具有旋转不变性;
    3. 不具有尺度不变性;

    二、算法流程

    Harris角点提取为以下步骤:

    1. IxIy,OpenCV中使用了sobel算子求梯度,其中x方向Gx=121000121y方向为GxT,其中M的形式为[ABBC]

    2. Ix2Iy2Ixy进行高斯加权,OpenCV使用了均值权

    3. 计算R=detMα(traceM)2>RtRt一般为了自适应图像对比度,会选择βmaxR
    4. 在一定窗口内进行非极大值抑制,局部最大值点即为图像中的角点。

    三、代码分析

    完整的代码可以参见Ronny写的【Harris角点检测的C++实现代码】,这里我们分析OpenCV1.0的代码。OpenCV1.0没有提供完整的函数提取Harris角点,cvCornerHarris()函数仅计算出每个像素单元的R值,如下:
    文件:./cv/src/cvcorner.cpp

    void cvCornerHarris(...)
    {
        // 一些参数检查
        icvCornerEigenValsVecs(...);
    }
    void icvCornerEigenValsVecs()
    {
        CvBoxFilter blur_filter;    // 窗口均值滤波器,./cv/include/cv.hpp中有声明
        // 一些参数检查和预处理
        ipp_sobel_vert(...);        // 计算水平梯度
        ipp_sobel_horiz(...);       // 计算垂直梯度
        // 将M矩形做成w*h*3的结构,第一通道放I_x^2,第二通道放I_yx,第三通道为I_y^2
        blur_filter.process(...)    // 窗口均值加权处理
        icvCalcHarris(...)          // 计算R值
    }

    Ronny的代码中非极大值抑制时用图像膨胀&&原图的方法,有缺陷,容易出现块状现象,以下是我的完整代码。

    int HarrisCorner(IplImage *imgSrc, std::vector<CvPoint> &corners)
    {
        assert(imgSrc->nChannels == 3);
    
        corners.clear();
    
        CvSize imgSz = cvGetSize(imgSrc);
        IplImage *gray = cvCreateImage(imgSz, 8, 1);
        cvCvtColor(imgSrc, gray, CV_BGR2GRAY);
    
        IplImage *response = cvCreateImage(imgSz, 32, 1);
        cvCornerHarris(gray, response, 3);
    
        double minValue, maxValue;
        cvMinMaxLoc(response, &minValue, &maxValue);
    
        double thr = 0.001 * maxValue;
        IplImage *binary = cvCreateImage(imgSz, 8, 1);
        cvThreshold(response, binary, thr, 255, CV_THRESH_BINARY);
    
        // 非极大值抑制
        for(int i = 1; i < imgSz.height - 1; i ++)
        {
            uchar *pre = (uchar*)(binary->imageData + binary->widthStep * (i - 1));
            uchar *ptr = (uchar*)(binary->imageData + binary->widthStep * i);
            uchar *nex = (uchar*)(binary->imageData + binary->widthStep * (i + 1));
            for(int j = 1; j < imgSz.width - 1; j ++)
            {
                // / 0 0 0 \
                // | 0 1 0 |
                // \ 0 0 0 /
                if(ptr[j] > pre[j-1] && ptr[j] > pre[j] && ptr[j] > pre[j+1] &&
                   ptr[j] > ptr[j-1] && ptr[j] > ptr[j+1] &&
                   ptr[j] > nex[j-1] && ptr[j] > nex[j] && ptr[j] > nex[j+1])
                {
                    corners.push_back(cvPoint(j, i));
                }
            }
        }
    
        cvReleaseImage(&gray);
        cvReleaseImage(&response);
        cvReleaseImage(&binary);
    }
    展开全文
  • SUSAN角点检测与匹配算法代码(OpenCV)

    千次阅读 2019-04-06 19:53:59
    SUSAN(Small univalue segment assimilating nucleus)是一种基于灰度图像以及窗口模板的特征获取方法,适用于图像中边缘和角点检测,对噪声鲁棒,而且具有简单、有效、计算速度快等特点。本文结合SUSAN算法原理,...
  • 本文主要讲述代码同时丰富参考博客中的一些小和问题 原文: https://blog.csdn.net/sunshine_zoe/article/details/78303658 参考资料 1、论文 Geiger A, Moosmann F, Car Ö, et al. Automatic ...
  • 早在 1988 年,Chris_Harris 和 Mike_Stephens在文章《A Combined Corner and Edge Detector》提出了角点检测的算法,该方法被命名为Harris角点检测。 具体原理可以参考各种文献资料,是一种很经典的算法。 个人...
  • 角点检测详细总结及代码示例

    万次阅读 多人点赞 2019-06-24 15:00:09
    角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维建模和目标识别等领域中。也称为特征点检测。 一、角点(corner) 角点通常被定义为两...
  • 紧接着“Harris角点检测代码分析”,这里主要分析OpenCV的cvGoodFeaturesToTrack()函数,这才是角点提取的真正代码
  • 【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测

    万次阅读 多人点赞 2012-07-31 13:25:07
    ,也就是图像中的特殊位置,是很常用的一类特征,的局部特征也可以叫做“关键特征”(keypoint feature),或“兴趣”(interest point),或“角点”(conrner)。 关于角点的具体描述可以有几种: 一阶导数(即...
  • 代码打包如下,可直接运行 链接:https://pan.baidu.com/s/17q146TAhOsD1UnwLxc_Bkw 提取码:r5t3 复制这段内容后打开百度网盘手机App,操作更方便哦
  • 本篇文章中,我们一起探讨了OpenCV中Harris角点检测相关的知识,学习了OpenCV中实现Harris角点检测的cornerHarris函数的使用方法。此博文一共有两个配套的麻雀虽小但五脏俱全的示例程序,其经过浅墨详细注释过的...
  • 1994年,J.Shi 和 C.Tomasi发表了文章《Good_Features_to_Track》,对Harris角点检测算法进行了改进。 具体原理可以参考各种文献资料,另外值得一提的是该算法适合运动物体的角点跟踪。 Opencv中的函数cv2....
  • Harris角点检测

    千次阅读 2020-02-25 12:49:21
    实验基础1.1角点概述1.2角点检测基本原理1.3Harris角点检测代码2.场景一:纹理平坦2.1实验结果2.2结果分析3.场景二:垂直或水平边缘多3.1实验结果3.2结果分析4.场景三:纹理角点丰富4.1实验结果4.2结果分析 1.实验...
  • 角点 特征检测与匹配是Computer Vision 应用总重要的一部分,这需要寻找图像之间的特征建立对应关系。,也就是图像中的特殊位置,是很常用的一类特征,的局部特征也可以叫做“关键特征”(keypoint feature)...
  • 上一篇介绍了基于生长的棋盘格角点检测方法的大概原理,详见:基于生长的棋盘格角点检测方法–(1)原理介绍 本文进一步从代码解读角度出发,更深入地理解工程中是如何实现的。 本文中用到的代码可以从以下链接...
  • OpenCV角点检测测试和比较

    千次阅读 2017-02-28 21:35:26
    关于特征检测,OpenCV提供了通用的接口FeatureDetector类。简单调用其成员函数create()和detect()即可完成角点检测。选取8个以角点为特征的特征检测器进行测试,包括: ...测试代码#include #includ
  • 接着上一篇基于生长的棋盘格角点检测方法–(2)代码详解(上),来看一下第二个重要函数chessboardsFromCorners。 该函数的目的是用上一步骤中找到的角点恢复出棋盘结构。首先初始化一个3x3的角点矩阵,也就是一个...
  • 图像处理之角点检测与亚像素角点定位 角点是图像中亮度变化最强地方反映了图像的本质特征,提取图像中的角点可以有效提高图像处理速度与精准度。所以对于整张图像来说特别重要,角点检测与提取的越准确图像处理与...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 227,317
精华内容 90,926
关键字:

角点检测代码