def bwareaopen(image, p, level):
#image为传入的灰度图或二值化后的图,p为小面积的大小,level为函数内部二值化阈值
import cv2
area = []
area1 = []
# 二值化函数
ret, binary = cv2.threshold(image, level, 255, cv2.THRESH_BINARY)
# 找轮廓
# contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
binary, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
cv2.drawContours(binary, contours, -1, (255, 255, 255), -1) # 第一个-1表示选择的轮廓 (全部选择) 第二个-1表示 轮廓线条 -1表示内部全部填充
# cv2.imshow("drawContours",binary)
len_contours = len(contours)
# print len_contours
for i in range(0, len_contours):
area.append(cv2.contourArea(contours[i]))
# print area
for i in range(0, len_contours):
if area[i] < p:
cv2.drawContours(binary, contours, i, (0, 0, 0), -1)
else:
pass
# 找轮廓
# contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
binary, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(binary, contours, -1, (255, 255, 255), -1) # 第一个-1表示选择的轮廓 (全部选择) 第二个-1表示 轮廓线条 -1表示内部全部填充
len_contours = len(contours)
for i in range(0, len_contours):
area1.append(cv2.contourArea(contours[i]))
#返回 去除小面积对象后的二值化图像,所有轮廓的面积构成的列表,轮廓个数
return binary, area1, len_contours