【问题标题】:Remove small areas with OpenCV in C++在 C++ 中使用 OpenCV 删除小区域
【发布时间】:2018-05-31 01:33:05
【问题描述】:

我设法用在 Stack Overflow 上找到的 Python 代码完成了我需要的工作:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
labelnum, labelimg, contours, GoCs = cv2.connectedComponentsWithStats(gray)
for label in xrange(1, labelnum):
    x,y,w,h,size = contours[label]
    if size <= N:
         img_white[y:y+h, x:x+w] = 0
cv2.imwrite("img_filter.png", img_white)

它通过访问轮廓元素设法去除小区域(小斑点和颗粒)。

我想用 C++ 来做这件事。可能吗?我找到了这个功能:

int connectedComponentsWithStats(InputArray image, OutputArray labels, OutputArray stats, OutputArray centroids, int connectivity=8, int ltype=CV_32S)

但我看不到如何访问轮廓元素。 有什么建议吗?

【问题讨论】:

  • 你最好给出你的测试图像。

标签: python c++ opencv


【解决方案1】:

stats 输出数组包含 CC_STAT_AREA 列等,它将为您提供连接组件的像素面积。

过滤小于 N 的组件的代码将应用条件if (stats.at&lt;int&gt;(label, CC_STAT_AREA) &lt; N) {…}。检查给定in this post的完整示例

请注意,连接组件不会为您提供轮廓,只是连接区域统计信息。您需要使用 OpenCV 的 findContours 函数来获取沿区域轮廓的所有点的列表。

【讨论】:

  • 如果您的标签不是 1(例如 3),则输出 CC_STAT_AREA 区域不是恒定的。每次运行程序时它都会有所不同。这正常吗?
  • 不是 100% 肯定,但可能标签并不总是以相同的顺序分配,除了第一个总是对应于背景。您可以通过为每个标签分配伪颜色来测试此行为,并为算法的多次运行呈现结果。
【解决方案2】:

也许只是侵蚀你的形象应该会有所帮助。

Morphological Transformations OpenCV

【讨论】:

    【解决方案3】:

    您可以使用以下代码,性能良好:

       Mat stats, centroids, labelImage, imshow_mat;
       int nLabels =
               connectedComponentsWithStats(bin_img, labelImage, stats, centroids, 4);
       Mat mask(labelImage.size(), CV_8UC1, Scalar(0));
       Mat surfSup=stats.col(4)>sz_min;
    
       int tmp_label;
    
    
       for (int i = 1; i < bin_img.rows; i++){
           for (int j = 1; j < bin_img.cols ; j++){
    
               tmp_label = labelImage.at<int>(i,j);
    
               mask.at<char>(i,j) = (char) surfSup.at<char>(tmp_label,0);
    
       }
       }
    
       Mat r(bin_img.size(), CV_8UC1, Scalar(0));
    
       bin_img.copyTo(r,mask);
    

    【讨论】:

      猜你喜欢
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多