zoukankan      html  css  js  c++  java
  • 边缘检测的各种畅想

    一直以来对OpenCV的边缘检测不满意,现在的边缘检测主要是基于各种算子,很多时候,边缘没办法非常细致的分割出来,后面ML的加入提供了更多的思路,在这里记录一下,最近的一些探索和想法,首先上一张图。

     目的在于提取图像中黑色纹路的地方,尝试过边缘增强,对比度增强算法,各种enhancement。

    效果很不明显,尤其是做了以下mat的背景相减,会发现其实阴影区域的像素值跟其他区域的差距很不明显:https://www.cnblogs.com/tornadomeet/archive/2012/06/02/2531705.html

    ,后面又尝试了基于OpenCV的阴影识别和提取。

    尝试包括:

    在运动目标检测中,常常会出现由于光线被遮挡,或场景其他物体的遮挡,在目标附近或场景里出现阴影,阴影的出现对后期目标的正确分割与处理带了很大的不便。如今,国内外已有不少文献来研究这个问题,并且提出了各种各样的阴影去除算法。本文就其中的一种算法提出了一个通用的实现算法,该算法考虑了背景与前景颜色相近的情况,希望能给大家一些帮助:(介绍下算法的思路:算法首先对RGB颜色空间的值进行归一化处理,即:r=R/(R+G+B),g=G/(R+G+B), I=(R+G+B)/3。然后利用背景和当前帧r,g的插值和I的比例来确定阴影区域:

                                                                    
    详细细节请参考文献:Detecting moving objects,ghosts and shadows in video streams
    code:
    // shadeImg is a binary image,the value th2 and th3 are chosen empirically here,set th2=0.6 th3=1.5, th4=7
    void ShadeDetect(IplImage *currImg, IplImage *bkImg, IplImage *shdadeImg,double th1,double th2,double th3,double th4)
    {
           cvZero(shdadeImg);
           unsigned char* currData;
           unsigned char* bkData;
           unsigned char* shadeData;
           int i=0,j=0;
           int height=currImg->height;
           int width=currImg->width;
           double rb=0,gb=0,Ib=0,Rb=0,Gb=0,Bb=0;
           double rt=0,gt=0,It=0,Rt=0,Gt=0,Bt=0;
          //CvScalar cs=cvScalarAll(255);
           for (i=0;i<height;i++)
           {
                 currData=(unsigned char*)currImg->imageData+i*currImg->widthStep;
                 bkData=(unsigned char*)bkImg->imageData+i*bkImg->widthStep;
                 shadeData=(unsigned char*)shdadeImg->imageData+i*shdadeImg->widthStep;
                for (j=0;j<width;j++)
               {
                    // current normalized
                      Rt=currData[j*3];
                      Gt=currData[j*3+1];
                      Bt=currData[j*3+2];
                      rt=Rt/(Rt+Gt+Bt);
                      gt=Gt/(Rt+Gt+Bt);
                      It=(Rt+Gt+Bt)/3;
                     // Bk normalized
                     Rb=bkData[j*3];
                     Gb=bkData[j*3+1];
                     Bb=bkData[j*3+2];
                    rb=Rb/(Rb+Gb+Bb);
                    gb=Gb/(Rb+Gb+Bb);
                    Ib=(Rb+Gb+Bb)/3;
                  // judge whether is shadeimg
                  if (fabs(rt-rb)<=th1 && fabs(gt-gb)<th1 && It/Ib>=th2 && It/Ib<=th3 && fabs(It-Bt)<th4)
                 {
                        shadeData[j]=255;
                 }  
           }
       }
    }

    代码改成mat格式,发现没有th1,把论文也撸了一遍也没看到,自己尝试了一些经验值,发现没啥效果。

    尝试二、

  • 相关阅读:
    32位IP地址
    我们必须知道,我们终将知道。
    【Java 小白菜入门笔记 2.1】面向对象相关
    【Java 小白菜入门笔记 1.3】流程控制、数组和输入输出
    【Java 小白菜入门笔记 1.2】运算符、方法和语句
    【Java 小白菜入门笔记 1.1】常量和变量
    【论文笔记】PyTorch-BigGraph: A Large-scale Graph Embedding Framework(大规模图嵌入)
    【Java 小白菜入门笔记 1.0】简介与HelloWorld
    【NLP模型笔记】GloVe模型简介
    Python中的defaultdict函数
  • 原文地址:https://www.cnblogs.com/Anita9002/p/8310112.html
Copyright © 2011-2022 走看看