求得不规则物体的长度
解决方案:
skimage.morphology 中的 skeletonize 函数用于将图像中的物体转换为其骨架(skeleton)。骨架是一个由像素组成的细线结构,代表了图像中物体的主要形状。
from skimage.morphology import skeletonize
from skimage import data
# 读取图像
image = data.horse()
# 将图像转换为二值图像(灰度图像或彩色图像均可)
# 这里使用灰度图像作为示例
gray_image = image[:,:,0]
# 对二值图像应用骨架化操作
skeleton = skeletonize(gray_image)
# 显示原始图像和骨架化后的图像
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1)
plt.imshow(gray_image, cmap='gray')
plt.title('Original Image')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.imshow(skeleton, cmap='gray')
plt.title('Skeletonized Image')
plt.axis('off')
plt.show()
具体应用举例:
Intercept为三通道或者二通道的图像数据
from skimage.morphology import skeletonize
def get_skeleton(blobs):
"""
骨骼提取
"""
skeleton = skeletonize(blobs) # ndarray, 为TRUE的元素代表骨骼线的位置
# skeleton_pts = np.argwhere(skeleton)
return skeleton
length = 0
# 求skeleton
# Intercept为三通道或者二通道的图像数据
# Intercept_gray = cv2.cvtColor(Intercept, cv2.COLOR_RGB2GRAY) # 转为灰度图
s_skeleton = get_skeleton(Intercept)
cv2.imshow("s_skeleton", s_skeleton)
# 将骨骼图转为灰度图
gqr_image_gray = cv2.cvtColor(s_skeleton, cv2.COLOR_RGB2GRAY) # 转为灰度图
cv2.imshow("gqr_image_gray", gqr_image_gray)
cv2.waitKey(0)
s_contours, _ = cv2.findContours(gqr_image_gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for s_contour in s_contours:
length += cv2.arcLength(s_contour, True) / 2