本文由 发布,转载请注明出处,如有问题请联系我们! 发布时间: 2021-05-28【工程应用四】 基于形状的多目标多角度的高速模板匹配算法进一步研究。

加载中

【工程项目运用四】 根据样子的多总体目标多方位的快速模板匹配优化算法进一步科学研究。

根据样子的模板匹配优化算法拥有 一些较为独特的地区,在许多 状况下到速率和精确度层面他拥有 好于根据NCC的配对的結果,并且根据样子能够用以带放缩的配对中,文中再次前边的系列产品文章内容简略的纪录了在自己完成这种优化算法的全过程中的一些体会心得和感受。

      前边有几篇文章内容提到了模板匹配优化算法,分别是【工程项目运用一】 多总体目标多方位的迅速模板匹配优化算法(根据NCC,实际效果无穷大Halcon中........) 及其【工程项目运用二】 多总体目标多方位的迅速模板匹配优化算法(根据边沿梯度方向),那麼历经近期两个多月的进一步科学研究,也拥有大量的一些体会心得和感受,这儿也简易共享一些在这个全过程中不属于我本人的了解的一些物品。

      1、在上一篇根据边沿梯度方向的文章内容中,我曾说应用Canny算法不适合,会遗失一些弱边沿的信息内容,可是事后我感觉或是能够的。

      2、在应用Canny后,一个非常好的益处便是能够不做高清图的测算了,这对速率的提升或是有非常大的奉献的,一般 Canny检验到的边沿占高清图的图像分辨率不容易超过1/10,。

                拓展一下:  假如不做 Canny,只是对高清图开展图像分割后,依照边沿点的抗压强度开展排列,随后取抗压强度的前1/10做为备选点,也无外乎一种解决困难的方式 ,可是检测发觉有时候会出现遗失或误选总体目标的状况。

     3、针对转动后的边沿难题,这一能够根据以下的方法开展处理。

               转动后的失效的清晰度处,依照水准或是竖直方位的信息内容,对失效的地区的清晰度用离其水准或竖直方位近期的合理清晰度添充。挑选水平方向完成更为简易和高效率。

               一个简单的代码以下所显示:

int IM_CorrectRotatedImage_Hori(HBitmap Src, HBitmap Mask)
{
    StartEnd *Hori = (StartEnd *)malloc(Mask.Height * sizeof(StartEnd));
    if (Hori == NULL)    return IM_STATUS_NULLREFRENCE;
    IM_SimpleMaskRLE_Hori(Mask, Hori);                            //    获得变小后的水准行程安排
    for (int Y = 0; Y < Src.Height; Y  )
    {
        if (Hori[Y].Start != -1)
        {
            memset(Src.Data   Y * Src.Stride, Src.Data[Y * Src.Stride   Hori[Y].Start], Hori[Y].Start);
            memset(Src.Data   Y * Src.Stride   Hori[Y].End   1, Src.Data[Y * Src.Stride   Hori[Y].End], Src.Width - Hori[Y].End - 1);
        }
    }
    int Top = -1, Bottom = -1;
    for (int Y = 0; Y < Src.Height; Y  )
    {
        if (Hori[Y].Start != -1)
        {
            Top = Y - 1;
            break;
        }
    }
    for (int Y = Src.Height - 1; Y >= 0; Y--)
    {
        if (Hori[Y].Start != -1)
        {
            Bottom = Y   1;
            break;
        }
    }
    if (Top != -1)
    {
        for (int Y = 0; Y <= Top; Y  )
        {
            memcpy(Src.Data   Y * Src.Stride, Src.Data   (Top   1) * Src.Stride, Src.Stride);
        }
    }

    if (Bottom != -1)
    {
        for (int Y = Src.Height - 1; Y >= Bottom; Y--)
        {
            memcpy(Src.Data   Y * Src.Stride, Src.Data   (Bottom - 1) * Src.Stride, Src.Stride);
        }
    }
    free(Hori);
    return IM_STATUS_OK;
}

        这时,再对于此事图做Canny图像分割,则失效处由于添充的基本上为同一清晰度或是类似,失效处的Canny值基本上为0,在转动的边沿处由于也是类似,值也约为0,即便不以0,也没有关系,转动后的蒙板图也会把这种部位给剪裁掉,因而,不容易造成新的边沿难题。以下所显示:

                                                      

                                                                       

                    模版图                                    转动一定视角的模版图             水平方向边沿添充                        Canny图像分割                        转动后相匹配的蒙板图                   依据蒙版裁剪后的边沿图

         针对第一个模版,由于其边沿你基本上为单色,因而拓展后的图没什么难题,而第二个图,拓展后的图开展检验,会见到在失效地区有一些附加的边沿发生,可是历经蒙版剪裁这种地区就消失了。

         4、针对评分公式计算,用   是彻底能够的,留意的事儿便是,针对模版图象 ,由于获取的备选点是用Canny挑选出来的,可能GX和GY一般也不会为0,最少不容易同是为0,因而全部算式真分数中的上半部分不容易为0, 那麼在程序编写时假如碰到在原照中的GX和Gy另外为0时,必须留意做尤其解决,避免 产生除于0的不正确,即此部位的奉献为0(分子结构必定为0)。

         拓展:  全部关系式是一个归一化的算式,由于模版开展了Canny挑选,可是原照相匹配的部位是动态性的,假如在原照中碰到那类较为光洁的地区(梯度方向值不大),例如GxS = 1, GyS = 2,那样的值,不管模版相匹配处的梯度方向怎样,评分都是会较为高,例如GxT = 230, GyT = 100,则这时此点的匹配度为:  1*230 2*100 /(sqrt(1*1 2*2)*sqrt(230*230 100*100)) =0.76, 很显著,大家感觉那样的状况是不能接纳的,因而,本人感觉针对那样的点,应当在预估得分时给予去除(不急切评分加持中)。

      5、为了更好地降低Canny检验的噪声,可在检验前开展适度的模糊不清,高斯模糊、平均值模糊不清、保边模糊不清随你选,可是半经不容易过大,并且要留意伴随着金字塔式的下采样,由于下采样自身便是一种均值,因而模糊不清的半经应当如何来着??????

      6、CodeProject上印尼小伙的评分贪心算法能够运用上,这一针对金字塔式高层的速率提升有比较显著的功效,可是针对事后的往上拓展检索加快功效比较有限,这一关键是由于事后的备选点评分自身就较为高了,那一个贪婪的规定规范也愈来愈难以实现。

      7、优化算法的速率提升上面有许多 方式 ,一个是基本原理上的,一个是编号上的。

          (1)基本原理上的,前边说的金字塔式时压根,Canny检验降低备选点是主要,贪心算法是甜品。此外便是在各层的新的备选点的挑选上,也应当逐级降低,实际操作的标准能够是: 2个备选点的座标部位过进,获得分多的。 备选点中间的地区重合渡过大, 能够只获得分多者这些。

           (2)编号上则八仙过海,神通广大了,我非常善于的是SIMD命令提升。这儿提好多个小的Trick。

            a、梯度方向值的储存。  以上边沿的梯度方向值Gx和Gy依据数据信息的范畴,很显著最好应用的基本数据类型是signed short。

            b、在SIMD命令中有一个_mm_madd_epi16,其函数原型为:

                       extern __m128i _mm_madd_epi16(__m128i _A, __m128i _B);

                   我还在我blog里数次提早这一涵数,他能够一次性型完成八个short种类数据信息的加法和4次int类型的加减法,以下所显示:  

                     

                    如果我们合理布局的情况下,把梯度方向的X和Y方位数据信息持续布局,那麼评分公式计算的分子和分母的四个一部分加法和加减法(下边的平方米也是加法)就可以立即运用那样的命令完成了,实际的自身好好地了解吧。

            c、求根号是个较慢的测算全过程,SIMD命令有_mm_sqrt_ps命令一次性完成4个浮点数数的开方,那麼依照上边的算式就还需规定到数,大家最先把评分算式的真分数中的2个根号里的数据信息乘积,随后在开根号,結果是一样的,很显著就少了一次开根号实际操作,         另外,注意到SIMD里还有一个命令,即_mm_rsqrt_ps,他能够一次性的进行开根号和求到数工作中,因而速率就更快了。

           d、此外也有一个点,我们在向金字塔式最底层检索的全过程中,一般的检索半经为2,即检索地区为5*5尺寸,针对这一规格,还能够一次性解决4个点,那样就构成 6*4 一个组成,这类组成比立即测算独立的25个点要速度更快许多 ,由于他防止了对模版数据信息的反复多次载入和测算。

           8、除开速率,也有优化算法可靠性难题,这一也是个较为难的难题,我现阶段也还碰到一些状况,例如不一样的起始点视角,全是慢360度的检索方向,回到的视角值很有可能有轻度的起伏,还例如有一些状况很有可能会遗失一些总体目标或找到不必要的总体目标这些。这一还必须事后再次科学研究,较为提升全过程中的亚清晰度参加等。

           9、较为了下halcon的create_shape_model和find_shape_model,发觉他的实体模型文档都尤其尤其的小,仅有几十KB,并且create_shape_model的全过程基本上是几豪击杀,因而,觉得他的构造应当更加叩门,或许是采用了亚清晰度层面的特点,必须慢慢看有么有机会寻找这些方面的材料了。

           10、halcon有根据样子的多总体目标、多方位、多放缩限度的模版检验,这一如今也在想,怎样降低测算量,有点儿不便。

           现阶段,历经一番骚操作,根据样子的配对在速率上面有的情况下竟然比根据NCC的还快了许多 ,并且結果上也相对稳定。

           假如哪个在工程项目实践活动中有必须相近的作用,我能给予涵数插口和Demo(根据边沿的优化算法),但是唯一的规定便是给予一些具体的素材图片供我检测优化算法用。

           这儿给予一个事例供大伙儿检测: https://files.cnblogs.com/files/Imageshop/TemplateMatching.rar

           假如想時刻关心自己的热门文章,也可扫码关注:     

 

 

评论(0条)

刀客源码 游客评论