将曲线识别为列表
To recognize curved line as a list
我正在尝试从仅包含单个曲线边缘的简单图像中识别曲线。
该线不能表示为公式,因为该线是完全随机生成的。
因此,保存曲线的唯一方法是保存像素位置并使用列表(或堆,向量,其他)连接它们。
示例:
有噪音的例子:
这个问题有什么算法或者解决方法吗?
您可以使用 findContours
和 drawContours
完成此任务。这是 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;
}
我正在尝试从仅包含单个曲线边缘的简单图像中识别曲线。 该线不能表示为公式,因为该线是完全随机生成的。 因此,保存曲线的唯一方法是保存像素位置并使用列表(或堆,向量,其他)连接它们。
示例:
有噪音的例子:
这个问题有什么算法或者解决方法吗?
您可以使用 findContours
和 drawContours
完成此任务。这是 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;
}