【问题标题】:Removing border lines in opencv and c++去除opencv和c++中的边界线
【发布时间】:2015-01-30 06:42:54
【问题描述】:

我有很多图片,有无文字,类似于上图。我想去除边缘的线条,如果图​​像中存在噪点,也可以去除噪点。

这些线条仅出现在边缘,因为我从表格中裁剪了这些图像。

【问题讨论】:

    标签: c++ opencv edge-detection


    【解决方案1】:

    您可以尝试以下方法。但我不能保证您的图像文件中的所有行都可以删除。

    首先通过应用霍夫变换检测图像中存在的所有线条

    vector<Vec2f> lines;
    HoughLines(img, lines, 1, CV_PI/180, 100, 0, 0 ); 
    

    然后遍历检测到的每一行,

    获取图片大小

    #you may have laoded image to some file
    #such as 
    #  Mat img=imread("some_file.jpg");
    int rows=img.rows;
    int colms=img.cols;
    Point pt3;
    

    现在你知道了矩阵的大小,接下来得到线的中心点,你可以这样做,

    for( size_t i = 0; i < lines.size(); i++ )
    
    {
      float rho = lines[i][0], theta = lines[i][1];
      Point pt1, pt2;
      double a = cos(theta), b = sin(theta);
      double x0 = a*rho, y0 = b*rho;
      pt1.x = cvRound(x0 + 1000*(-b));
      pt1.y = cvRound(y0 + 1000*(a));
      pt2.x = cvRound(x0 - 1000*(-b));
      pt2.y = cvRound(y0 - 1000*(a));
      pt3.x=(pt1.x+pt2.x)/2;
      pt3.y=(pt1.y+pt2.y)/2;
    
      *** 
      //decide whether you want to remove the line,i.e change line color to 
      // white or not
    
        line( img, pt1, pt2, Scalar(255,255,255), 3, CV_AA); // if you want to change
    }
    

    ***一旦你有了图像的中心点和大小,你就可以比较中心点的位置是左、右、上、下。您可以通过以下比较来做到这一点。不要使用 (==) 允许一些差异。
    1. (0, cols/2) -- 图像顶部, 2. (rows/2,0) -- 图像左侧, 3. (rows, cols/2) -- 图像底部 4. (rows/2, cols) -- 图片右侧

    (由于您的图像已经模糊,平滑、腐蚀和膨胀可能效果不佳)

    【讨论】:

    • 您是否提出条件来决定是否更换线路?如果你还没有,那么你会得到随机线。我现在没有我的系统。所以我现在不能和你核对。
    • 是的。阅读我答案的最后一部分。 *** 部分。将您的决策放入代码中(代替代码中的 ***)
    【解决方案2】:

    如果您的图像都相同,那么只需使用 OpenCV 裁剪底部...

    或者this link 演示如何从图像中删除黑色边框。

    为了清理文本,您可以尝试denoising

    【讨论】:

    • 所有图片的大小都是可变的。所以我不能进行裁剪。我会尝试使用轮廓和去噪。
    • 我尝试过使用轮廓,它的作用与裁剪相同。我不能允许裁剪,因为很少有图像在边框之前有文字。我只需要消除线条。
    猜你喜欢
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多