我设法用我在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)
但是我没有看到如何访问轮廓元素。 有提示吗?
答案 0 :(得分:1)
stats输出数组包含CC_STAT_AREA列,其中将为您提供连接组件的像素区域。
过滤掉小于N的组件的代码将应用条件if (stats.at<int>(label, CC_STAT_AREA) < N) {…}
。查看给定in this post
请注意,连接的组件不会为您提供轮廓,只会显示连接区域的统计信息。您需要使用OpenCV的findContours
函数来获取区域轮廓上所有点的列表。
答案 1 :(得分:0)
也许只是侵蚀你的形象应该有帮助。
答案 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);