分别是提取出的骨架和二值化原图;骨架周围没有多余的像素点;超级好用!!!
import cv2 as cv
import os
import numpy as np
from skimage import morphology
from skimage.io import imsave
# 输入和输出文件夹路径
input_folder = r'C:\Users\Administrator\Desktop\mask-sele' # 输入文件夹路径,存放二值化图片
output_folder = r'C:\Users\Administrator\Desktop\gujiagujia' # 输出文件夹路径,用来保存骨架图像
# 创建输出文件夹(如果不存在)
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 获取所有二值化图片文件
image_files = [f for f in os.listdir(input_folder) if f.endswith('.png')]
# 遍历每一张图片并提取骨架
for img_name in image_files:
# 读取图片(确保是二值图像)
img_path = os.path.join(input_folder, img_name)
img = cv.imread(img_path, cv.IMREAD_GRAYSCALE) # 读取为灰度图像
# 骨架提取
skeleton = morphology.skeletonize(img // 255) # 归一化为[0, 1],然后进行骨架提取
skeleton = np.where(skeleton > 0, 1, 0).astype(np.uint8) # 转回0-255的二值图像
# 保存骨架图像到输出文件夹
output_img_path = os.path.join(output_folder, img_name)
imsave(output_img_path, skeleton * 255) # 保存为8位的图像
print(f"骨架已提取并保存: {output_img_path}")