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,把论文也撸了一遍也没看到,自己尝试了一些经验值,发现没啥效果。

    尝试二、

  • 相关阅读:
    HDU3336 Count the string —— KMP next数组
    CodeForces
    51Nod 1627 瞬间移动 —— 组合数学
    51Nod 1158 全是1的最大子矩阵 —— 预处理 + 暴力枚举 or 单调栈
    51Nod 1225 余数之和 —— 分区枚举
    51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP
    51Nod 机器人走方格 V3 —— 卡特兰数、Lucas定理
    51Nod XOR key —— 区间最大异或值 可持久化字典树
    HDU4825 Xor Sum —— Trie树
    51Nod 1515 明辨是非 —— 并查集 + 启发式合并
  • 原文地址:https://www.cnblogs.com/Anita9002/p/8310112.html
Copyright © 2011-2022 走看看