删除opencv和c ++中的边框线

时间:2015-01-30 06:42:55

标签: c++ opencv edge-detection

enter image description here

我有很多图像有和没有类似于上图的文字。我想删除边缘的线条,如果图​​像中有任何噪声,也要去除噪音。

这些线仅存在于边缘,因为我从表中裁剪了这些图像。

2 个答案:

答案 0 :(得分:2)

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

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

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) - 图像右侧

(因为你的图像已经模糊,平滑,侵蚀和扩张可能效果不佳)

答案 1 :(得分:1)

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

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

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