Python 用C+中的OpenCV移除小区域+;

Python 用C+中的OpenCV移除小区域+;,python,c++,opencv,Python,C++,Opencv,我用在堆栈溢出中找到的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:

我用在堆栈溢出中找到的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)
但我不知道如何访问轮廓元素。
任何提示?

统计输出数组包含CC_STAT_AREA列,该列将以像素为单位显示连接组件的面积

用于过滤小于N的组件的代码将应用条件
if(stats.at(label,CC_STAT_AREA)
。检查给出的完整示例


请注意,连接的组件不会提供轮廓,只提供连接的区域统计信息。您需要使用OpenCV的
findContours
功能,以获得沿区域轮廓的所有点的列表。

可能只是侵蚀您的图像会有所帮助


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

   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);
Mat统计、质心、标签图像、imshow\u Mat;
int-nLabels=
连接的组件具有统计信息(bin_img、labelImage、统计信息、质心、4);
Mat掩模(labelImage.size(),CV_8UC1,标量(0));
Mat surfSup=统计列(4)>sz_min;
int tmp_标签;
对于(int i=1;i
您最好给出您的测试图像。如果您的标签不同于1(例如3),则输出CC_STAT_区域不是常量。每次我运行程序时,它都会变化。这正常吗?不是100%确定,但可能不是所有标签都按相同的顺序分配,除了第一个标签总是与背景相对应。您可以通过为每个标签指定一个伪颜色来测试此行为,并为算法的多次运行呈现结果。
   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);