将曲线识别为列表

To recognize curved line as a list

我正在尝试从仅包含单个曲线边缘的简单图像中识别曲线。 该线不能表示为公式,因为该线是完全随机生成的。 因此,保存曲线的唯一方法是保存像素位置并使用列表(或堆,向量,其他)连接它们。

示例:

有噪音的例子:

这个问题有什么算法或者解决方法吗?

您可以使用 findContoursdrawContours 完成此任务。这是 tutorial from OpenCV

findContours 将在 std::vector<std::vector<cv::Point>> 中存储每个轮廓点的有序序列。您可以使用 drawContour.

重建原始轮廓

或者您可以使用 findNonZero 收集图像中的所有非零点,将点保存在 std::vector<cv::Point> 中。然后您可以设置所有这些点来重建您的原始图像。

查看以下代码中的两种方法:

#include <opencv2/opencv.hpp>
using namespace cv;

int main(int, char**)
{
    // Load grayscale image
    Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);

    // Get all contours in the image
    vector<vector<Point>> contours;
    findContours(img.clone(), contours, CV_RETR_LIST, CHAIN_APPROX_NONE);

    // Draw all contours in green on a black image
    Mat3b rec(img.rows, img.cols, Vec3b(0,0,0));
    drawContours(rec, contours, -1, Scalar(0,255,0), 1);

    imshow("Original", img);
    imshow("Reconstructed", rec);
    waitKey();


    // Save all non-zero pixel positions
    vector<Point> pts;
    findNonZero(img, pts);

    // Set the pixels to red, according to the points in pts
    Mat3b rec2(img.rows, img.cols, Vec3b(0, 0, 0));
    for (int i = 0; i < pts.size(); ++i)
    {
        rec2(pts[i]) = Vec3b(0,0,255);
    }

    imshow("Reconstructed 2", rec2);
    waitKey();

    return 0;
}