Opencv学习笔记:Canny及HoughLines使用

最近使用opencv进行边缘提取和计算其参数时,遇到了一些问题;其中比较主要的问题在于Canny函数和HoughLines函数。

问题及其解决方案如下:

1、Canny轮廓不闭合

为提取边缘,一般情况下是首先使用Canny获取轮廓,然后使用findContours将这些轮廓全部提取出来。通常情况下,这样处理并不会有太大问题。但是在一些特殊情况下一定需要提取到闭合轮廓,而我在使用Canny算子时发现,在一些对比度不是特别强的图像上可能会存在本身闭合的一些轮廓经过Canny提取后,得到不闭合的轮廓

方案

这种情况下,当然可以通过增强对比度来提高对比度,从而保证得到闭合的轮廓。但是具体设置多高的对比度是一个参数问题,不具有普适化!
因此解决方案是,在Canny之后进行一次膨胀,从而将不闭合的轮廓闭合。

Mat element = getStructuringElement( MORPH_RECT,Size(2,2));
dilate( canny_image, canny_image, element );

值得注意

值得注意的是,这种方法只能保证差几个像素闭合的轮廓闭合,对于差距较大的轮廓并不适用。
另外一点是,我的实验发现在findContours之前,使用Canny比使用threshold效果更好。

2.HoughLines的线段重合

边缘提取之后,要对边缘进行参数化,一般情况下HoughLines是一个非常好的选择。但是我在使用中发现,对于同一个边,可能会提取出好几条重复的直线。这个使用可以根据rho和theta对相邻直线进行合并。
代码如下:

          vector lines;//定义一个矢量结构lines用于存放得到的线段矢量集合  
          HoughLines(image, lines, 1, CV_PI / 180, min(train_image.cols,train_image.rows)*0.4);
          //merge some lines
          for( size_t k = 0;k < lines.size();k++ )
          {
              float theta = lines[k][1];
              if(theta>CV_PI)
              {
                lines[k][0] = -lines[k][0];
                lines[k][1] = lines[k][1]-CV_PI;
              }
          }
          vector merged_lines;
          for( size_t k = 0;k < lines.size();k++ )
          {
              if(merged_lines.size()==0)
              {
                merged_lines.push_back(lines[k]);
                continue;
              }
              float cur_rho = lines[k][0], cur_theta = lines[k][1];
              bool add_or_not = true;
              for(size_t m=0;mfloat last_rho = merged_lines[m][0], last_theta = merged_lines[m][1];
                if(abs(cur_rho-last_rho)<4 && abs(cur_theta-last_theta)<0.1)//此处的阈值可自行调整
                {
                  merged_lines[m][0] = (cur_rho+last_rho)/2;
                  merged_lines[m][1] = (cur_theta+last_theta)/2;
                  add_or_not = false;
                  break;
                }
              }

              if(add_or_not)
              {
                merged_lines.push_back(lines[k]);
              }
          }

你可能感兴趣的:(Opencv)