如何在scikit-image输出图像显示regionprops标签以匹配各区域测量值
实现分割区域标签标注的方法
你可以通过获取每个分割区域的质心坐标,在图像上叠加标注文本,直接建立标签和测量数据的对应关系,修改后的参考代码如下:
import cv2 import numpy as np from matplotlib import pyplot as plt from skimage import measure, io, img_as_ubyte from skimage.color import label2rgb, rgb2gray import pandas as pd img = cv2.imread("F:\py_image_pro\pore.jpg", 0) scale = 0.086 # 1像素对应的微米数 # 阈值分割+去除边缘连通域 from skimage.filters import threshold_otsu threshold = threshold_otsu(img) thresholded_img = img < threshold from skimage.segmentation import clear_border edge_touching_removed = clear_border(thresholded_img) label_image = measure.label(edge_touching_removed, connectivity=img.ndim) image_label_overlay = label2rgb(label_image, image=img) # 生成测量数据表 props = measure.regionprops_table(label_image, img, properties=['label', 'area', 'equivalent_diameter', 'mean_intensity', 'solidity']) df = pd.DataFrame(props) df = df[df['area'] > 20] df['area_in_microns'] = df['area'] * (scale**2) df['equivalent_diameter_microns'] = df['equivalent_diameter'] * (scale) print(df.head()) # 新增标签标注逻辑 plt.imshow(image_label_overlay) # 遍历所有分割区域获取质心和标签 for region in measure.regionprops(label_image): # 跳过面积小于20的区域,和表格筛选逻辑保持一致 if region.area < 20: continue # centroid返回格式为(行坐标y, 列坐标x),matplotlib的text参数顺序为(x,y,文本内容) y, x = region.centroid # 标注标签号,颜色、字号可根据图像情况调整,ha/va参数保证文本在区域中心对齐 plt.text(x, y, str(region.label), color='white', fontsize=12, ha='center', va='center') plt.show()
如果需要直接在图上标注面积、等效直径等测量数据,只需修改plt.text的文本内容即可,比如替换为f"{region.label}:{region.area*(scale**2):.2f}μm²"就能同时显示标签和对应面积。
标注的标签号和DataFrame里的label列完全对应,直接查表即可获取该区域的所有测量参数。
内容的提问来源于stack exchange,提问作者user15877014
相关产品推荐
相关产品推荐

