C++ 基于局部曲率的彩色图像边界

C++ 基于局部曲率的彩色图像边界,c++,algorithm,opencv,image-processing,opencv3.0,C++,Algorithm,Opencv,Image Processing,Opencv3.0,我正在搜索一种算法(使用OpenCV C或C++),它可以: 给定边界图像,我想找到所有点的局部曲率并对其进行颜色映射,这就是上面显示的图像中所做的。我从中获得了这张图像,但还没有找到一种方法来用这种方式给边界着色。请告诉我怎么做 如果观察边界,红色表示边界具有高坡度,黄色表示边界几乎是线性的 如何做到这一点 编辑 只是想让你了解我两天来是如何尝试的: 我使用了openCV函数convexHull和convexityDefects,但意识到我走错了方向。我只需要处理二值图像的轮廓/边界 您可以

我正在搜索一种算法(使用OpenCV C或C++),它可以:

给定边界图像,我想找到所有点的局部曲率并对其进行颜色映射,这就是上面显示的图像中所做的。我从中获得了这张图像,但还没有找到一种方法来用这种方式给边界着色。请告诉我怎么做

如果观察边界,红色表示边界具有高坡度,黄色表示边界几乎是线性的

如何做到这一点

编辑

只是想让你了解我两天来是如何尝试的:


我使用了openCV函数
convexHull
convexityDefects
,但意识到我走错了方向。我只需要处理二值图像的轮廓/边界

您可以通过将三次贝塞尔曲线的路径拟合到边界,然后解析地获取曲率来解决此问题

[详细说明]

边界由像素中心的x、y点列表组成,每个点1px或根2 px构成列表中的下一个点。您需要使用Schnider在Graphics Gems(Gems 1,pp 612,一种拟合数字化曲线的算法)中的技术来拟合平滑的立方贝塞尔路径

沿曲线的步长,采用始终为亚像素的微小步长,以及 使用

double BezierCurve::Curvature(double t) const
    {
        // Nice mathematically perfect formula
        //Vector2 d1 = Tangent(t);
        //Vector2 d2 = Deriv2(t);
        //return (d1.x * d2.y - d1.y * d2.x) / pow(d1.x * d1.x + d1.y * d1.y, 1.5);

        // Get the cubic coefficients like this, I store them in the Bezier
        // class
        /*
        a = p3 + 3.0 * p1 - 3.0 * p2 - p0;
        b = 3.0 * p0 - 6.0 * p1 + 3.0 * p2;
        c = 3.0 * p1 - 3.0 * p0;
        d = p0;
        */


        double dx, dy, ddx, ddy;

        dx = 3 * this->ax * t*t + 2 * this->bx * t + this->cx;
        ddx = 6 * this->ax * t + 2 * this->bx;
        dy = 3 * this->ay * t*t + 2 * this->by * t + this->cy;
        ddy = 6 * this->ay * t + 2 * this->by;

        if (dx == 0 && dy == 0)
            return 0;

        return (dx*ddy - ddx*dy) / ((dx*dx + dy*dy)*sqrt(dx*dx + dy*dy));

    }

OpenCV
findContours
与mode=CV\u RETR\u EXTERNAL和method=CV\u CHAIN\u APPROX\u一起使用时,无将为您提供所有按顺序排列的边界像素,例如两个后续点是相邻点

要通过三个点得到圆周的半径,网络上有很多信息。因为你只需要半径,而不是中心,是快的

在伪代码中:

vector_of_points = OpenCV::findContours(...)
p1 = vector start
p2, p3 are next points in vector

//boundary is circular, so in the first loop pass we must adjust
p2 = next point
p3 = last point

//Use p1 as our iterator
while ( p1 <= vector.end )
{
    //curvature    
    radius = calculateRadius(p1, p2, p3)
    //set color for pixel p2
    setColor(p, radius)

    increment p1, p2, p3
    adjust for start point = end point
}
vector\u of_points=OpenCV::findContours(…)
p1=矢量开始
p2、p3是向量中的下一个点
//边界是圆形的,所以在第一个循环过程中我们必须调整
p2=下一点
p3=最后一点
//使用p1作为迭代器

(p1)如果有人选择结束这个问题,请告诉我原因。我花了2天的时间,仍然不知道如何在边界中找到局部曲率。要检测边界,可以使用一些*卷积矩阵".曲率可以通过三个点求圆周半径来计算。网络上有很多信息。是的,我也可以使用openCV函数
findContetors
来检测边界。之后?我无法继续。我如何找到三个点来计算曲率半径?我对这门课程不熟悉ept.你能详细说明一下吗?