如何删除canny图像中的直线或非曲线

时间:2016-05-04 11:01:29

标签: c++ opencv image-processing image-segmentation canny-operator

我有一个精明的边缘图像 enter image description here

除了看起来像半圆/椭圆或“C'”的线条之外,我想删除所有线条。 Tried Hough Circle转换,它检测所有曲线。不需要。

2 个答案:

答案 0 :(得分:6)

一个简单的方法是:

  1. 查找已连接的组件
  2. 找到最小面向边界框
  3. 计算包装盒的纵横比,并检查它是否太长拉长
  4. 在你的图像上,我用红色几乎笔直的线标记,用绿色标记曲线。您可以使用宽高比的阈值:

    enter image description here

    代码:

    #include<opencv2/opencv.hpp>
    using namespace cv;
    
    
    int main()
    {
        // Load image
        Mat1b img = imread("path_to_img", IMREAD_GRAYSCALE);
    
        // Create output image
        Mat3b out;
        cvtColor(img, out, COLOR_GRAY2BGR);
    
        // Find contours
        vector<vector<Point>> contours;
        findContours(img.clone(), contours, RETR_LIST, CHAIN_APPROX_NONE);
    
        for (const auto& contour : contours)
        {
            // Find minimum area rectangle
            RotatedRect rr = minAreaRect(contour);
    
            // Compute aspect ratio
            float aspect_ratio = min(rr.size.width, rr.size.height) / max(rr.size.width, rr.size.height);
    
            // Define a threshold on the aspect ratio in [0, 1]
            float thresh = 0.2f;
    
            Vec3b color;
            if (aspect_ratio < thresh) { 
                // Almost straight line
                color = Vec3b(0,0,255); // RED
            }
            else {
                // Curved line
                color = Vec3b(0, 255, 0); // GREEN
            }
    
            // Color output image
            for (const auto& pt : contour) {
                out(pt) = color;
            }
        }
    
        imshow("Out", out);
        waitKey();
    
        return 0;
    }
    

答案 1 :(得分:2)

  1. 从边缘找到轮廓。
  2. 获取边界框。
  3. 计算边界框的对角线大小与轮廓大小的比率。
  4. 此值将接近&#39; 1&#39;直边。这个比率的值越高,边缘的曲率就越大。它可以大致但非常准确地估计边缘的弯曲度。

    快乐编码