Active Contour Models in OpenCV 3.0

后端 未结 1 836
一生所求
一生所求 2020-12-11 11:48

I\'m trying to implement an Active Contour Models algorithm with Opencv 3.0 in C++. This algorithm is based on a script I wrote for MatLab and is not working as it supposed

相关标签:
1条回答
  • 2020-12-11 12:38

    As asked by David Doria, here is the final version of the function get_eext after a few corrections. This version worked fine for me.

    Mat config_eext(float wl, float we, float wt, Mat image)
    {
    Mat eline, gradx, grady, img_gray, eedge;
    
    //bitdepth defined as CV_32F
    image.convertTo(img_gray, bitdepth);
    
    //Convolution Kernels
    Mat m1, m2, m3, m4, m5;
    m1 = (Mat_<float>(1, 2) << 1, -1);
    m2 = (Mat_<float>(2, 1) << 1, -1);
    m3 = (Mat_<float>(1, 3) << 1, -2, 1);
    m4 = (Mat_<float>(3, 1) << 1, -2, 1);
    m5 = (Mat_<float>(2, 2) << 1, -1, -1, 1);
    
    img_gray.copyTo(eline);
    
    //Kernels de gradiente
    Mat kernelx = (Mat_<float>(1, 3) << -1, 0, 1);
    Mat kernely = (Mat_<float>(3, 1) << -1, 0, 1);
    
    //Gradiente em x e em y
    filter2D(img_gray, gradx, -1, kernelx);
    filter2D(img_gray, grady, -1, kernely);
    
    //Edge Energy como definido por Kass
    eedge = -1 * (gradx.mul(gradx) + grady.mul(grady));
    
    //Termination Energy Convolution
    Mat cx, cy, cxx, cyy, cxy, eterm(img_gray.rows, img_gray.cols, bitdepth), cxm1, den, cxcx, cxcxm1, cxcxcy, cxcycxy, cycycxx;
    filter2D(img_gray, cx, bitdepth, m1);
    filter2D(img_gray, cy, bitdepth, m2);
    filter2D(img_gray, cxx, bitdepth, m3);
    filter2D(img_gray, cyy, bitdepth, m4);
    filter2D(img_gray, cxy, bitdepth, m5);
    
    //element wise operations to find Eterm
    cxcx = cx.mul(cx);
    cxcx.convertTo(cxcxm1, -1, 1, 1);
    den = cxcxm1 + cy.mul(cy);
    cv::pow(den, 1.5, den);
    cxcxcy = cxcx.mul(cy);
    cxcycxy = cx.mul(cy);
    cxcycxy = cxcycxy.mul(cxy);
    cycycxx = cy.mul(cy);
    cycycxx = cycycxx.mul(cxx);
    eterm = (cxcxcy - 2 * cxcycxy + cycycxx);
    cv::divide(eterm, den, eterm, -1);
    
    //Image energy
    Mat eext;
    eext = wl*eline + we*eedge + wt*eterm;
    return eext;
    }
    

    Hope it helps!

    0 讨论(0)
提交回复
热议问题