import cv2
import numpy as np
src = cv2.imread(r"D:/example/b.png")
gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)#转灰度
#cv2.imshow("gray",gray)
canny1 = cv2.Canny(gray,100, 150)#滤镜
cv2.imwrite('Y:/cv_canny.jpg', canny1)#保存
_, labels, stats, centroids = cv2.connectedComponentsWithStats(canny1)#connectedComponentsWithStats
print(centroids)# 每个域的质心坐标
print("stats", stats)
for istat in stats[1:]:#0是默认的图片大小,所以从1开始
if istat[4] <100:#如果面积小于100,被认为是干扰,剔除
#print('istat[4]',istat[4])
# print(istat[0:2])
# if istat[3] > istat[4]:
# r = istat[3]
# else:
# r = istat[4]
cv2.rectangle(canny1, tuple(istat[0:2]), tuple(istat[0:2] + istat[2:4]), 0, thickness=-1) # 画矩阵,厚度是-1,间接用方法提出
#connectedComponentsWithStats 计算连通域的面积,主要用到第三个参数 stats
#主要是输出stats,是个列表,分别是/连通域的boundingbox的最左边,连通域的boundingbox的最上边,宽,高,面积
#杂点的宽和高不一定是宽*高=面积,
cv2.imwrite('Y:/cv_after.png', canny1)
cv2.waitKey(0)#如果x=0,则无限等待下去,直到有按键按下
cv2.destroyAllWindows()#为了能正常关闭所有的绘图窗口
原图效果
剔除效果