opencv - 查找图像中指向一个方向的所有线

标签 opencv image-processing filtering

我正试图想出一个过滤器,它只会显示指向一个方向的线。

假设我们有这样的原始图像: Original Image

我需要应用什么过滤器才能只选择垂直线。就像这里用红色突出显示的那些。 Red Highlight on Vertical lines

此过滤器是否可以通用以允许我选择其他方向?例如,从左下角到右上角的对角线。

最佳答案

最直接(虽然不是最快)的解决方案是使用霍夫变换来检测直线,然后测量直线的斜率,只留下垂直的。

请先看看本教程https://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html .

这是一个或多或少解决您问题的代码示例。您可能需要调整一些参数以获得更好的结果:

std::vector<cv::Vec4i> extractVerticalLines(const std::vector<cv::Vec4i>& lines, int tollerance)
{
    std::vector<cv::Vec4i> output;
    for(const auto& line : lines)
    {
        // subtract x0 and x1 component (horizontal beginning and horizontal end)
        if(std::abs(line[0] - line[2]) <= tollerance)
        {
            output.push_back(line);
        }
    }

    return output;
}

void drawLines(cv::Mat& inputImage, const std::vector<cv::Vec4i>& lines, const cv::Scalar& color, int thickness)
{
    for(const auto& line : lines)
    {
        cv::line(inputImage, cv::Point2i(line[0], line[1]), cv::Point2i(line[2], line[3]), color, thickness);
    }
}

std::vector<cv::Vec4i> extractAllLines(const cv::Mat& image, int threshold, double minLength = 100)
{
    std::vector<cv::Vec4i> lines;
    cv::HoughLinesP(image, lines, 1, CV_PI / 180, threshold, minLength);
    return lines;
}

int main()
{
    auto image = cv::imread("lines.png", cv::IMREAD_GRAYSCALE);
    auto output = cv::Mat(image.size(), image.type(), cv::Scalar::all(0));
    image = ~image; // invert colors because background should be black and lines white

    auto lines = extractAllLines(image, 50);
    auto verticalLines = extractVerticalLines(lines, 5);
    drawLines(output, verticalLines, cv::Scalar::all(255), 1);
    cv::imshow("Result", output);
    cv::waitKey(0);
}

这会产生以下结果: Result 请记住,输出中有多行合并在一起。如果你想要垂直只有一条线,你必须首先对图像进行骨架化,这样所有的东西都是 1px 厚,或者尝试对结果进行一些智能过滤。

关于opencv - 查找图像中指向一个方向的所有线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48412374/

相关文章:

opencv - 在没有 GPU 的情况下编译 OpenCV?

javascript 加载的图像模糊 (PNG)

python - 使用ffmpeg读取streamlink m3u8文件

python - 收集所有不同轮廓的非零像素

array.filter() 中的 javascript 字符串比较问题

android - Android 中的 OpenCV 管理器安装不工作,不支持 Ccamera

c++ - 检测 parking 场线和ROI openCV

javascript - OpenCV.js - 为 CascadeClassifier 创建一个 RectVector 对象

filtering - 如果主机名与 x.domaine.com (Haproxy) 匹配,如何平衡到特定服务器

python - 如何组合 icontains 过滤器,以便同时从一个字段和另一个字段进行搜索