使用C ++中的OpenCV删除小区域

时间:2017-12-17 14:27:06

标签: python c++ opencv

我设法用我在Stack Overflow上找到的Python代码做我需要的东西:

20171125123000209

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

我想在C ++中这样做。可能吗?我找到了这个功能:

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)

但是我没有看到如何访问轮廓元素。 有提示吗?

3 个答案:

答案 0 :(得分:1)

stats输出数组包含CC_STAT_AREA列,其中将为您提供连接组件的像素区域。

过滤掉小于N的组件的代码将应用条件if (stats.at<int>(label, CC_STAT_AREA) < N) {…}。查看给定in this post

的完整示例

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

答案 1 :(得分:0)

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

Morphological Transformations OpenCV

答案 2 :(得分:0)

您可以使用以下具有良好性能的代码:

   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);