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