输入:
一张掩膜图
输出:
该掩膜的边界点,顺序表示
最大连通分量
输入一张mask 有多个连通分量
输出一个mask 只有一个最大的连通分量
def findmax(path):
# 图像读取
imagePath = path
img = cv2.imread(imagePath, 0)
ret, img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY)
# cv2.imwrite('binary.png', img)
# # 图像实例化
img = measure.label(img, connectivity=1) #4连通
props = measure.regionprops(img)
# cv2.imwrite('binary1.png', img)
#
# 最大区域获取
max_area = 0
max_index = 0
# props只包含像素值不为零区域的属性,因此index要从1开始
for index, prop in enumerate(props, start=1):
if prop.area > max_area:
max_area = prop.area
# index 代表每个联通区域内的像素值;prop.area代表相应连通区域内的像素个数
max_index = index
img[img != max_index] = 0
img[img == max_index] = 255
# img = np.array(img,dtype='uint8')
return img
边界跟踪
def edge(img):
# edge = cv2.imread(r"D:\project\lab\badminton\chafen\final1.png", 0)
img_list = img.tolist()
# print(edge.shape)
flag = 0
for i in range(1, img.shape[0] - 1): # 将单独特殊点删除 否则影响后续标记
for j in range(1, img.shape[1] - 1): # w 列
if img_list[i + 1][j] + img_list[i + 1][j - 1] + img_list[i + 1][j + 1]\
+ img_list[i][j + 1]+ img_list[i][j - 1]\
+ img_list[i - 1][j]+ img_list[i - 1][j + 1]+ img_list[i - 1][j - 1] == 255:
img_list[i][j] = 0
for i in range(1, img.shape[0] - 1): # 找到起始点
for j in range(1, img.shape[1] - 1): # w 列
if img_list[i][j] == 255:
flag = 1
print(i, j)
break
if flag == 1:
break
flag_list = np.zeros(img.shape)
list1 = []
b = True
dirs = [[0, 0], [0, -1], [1, -1], [1, 0], [1, 1], [0, 1], [-1, 1], [-1, 0], [-1, -1], [0, -1]]
while 1:
for m in range(0, 11):
try:
if img_list[i + dirs[m][0]][j + dirs[m][1]] == 0:
b = True
if img_list[i + dirs[m][0]][j + dirs[m][1]] == 255 and flag_list[i + dirs[m][0]][
j + dirs[m][1]] == 0 and b == True:
list1.append([j + dirs[m][1], i + dirs[m][0]])
flag_list[i + dirs[m][0]][j + dirs[m][1]] = 255
i = i + dirs[m][0]
j = j + dirs[m][1]
b = False
break
except:
cv2.imwrite('shuzu.png', flag_list)
return list1