基于Otsu阈值和Skimage的图像感兴趣区域(ROI)属性计算方法咨询
实现方案
你当前的需求可以直接通过两步完成,skimage.measure.regionprops完全适配该场景,专门用于计算二值图像中连通区域的各类形态、灰度属性。
步骤1:清除零散噪点
你提到的零散小像素噪点可以用skimage.morphology.remove_small_objects快速清理,该函数会自动删除像素数小于设定阈值的连通区域,无需额外复杂操作。如果去噪后还有边缘毛刺,可搭配形态学开运算进一步优化。
步骤2:计算目标区域属性
给去噪后的二值图标注连通域后,直接调用regionprops即可提取你需要的所有属性,注意如果要计算mean_intensity需要传入原始灰度图作为参数。
完整可运行代码(直接接在你现有代码之后即可)
from skimage.morphology import remove_small_objects from skimage import measure # 去噪:min_size为最小保留的连通区域像素数,可根据实际噪点大小灵活调整 cleaned_img = remove_small_objects(thresholded_img, min_size=200) # 可取消下方注释查看去噪效果 # plt.imshow(cleaned_img, cmap='gray') # 标记连通区域 label_img = measure.label(cleaned_img) # 计算所有连通区域属性,传入原始灰度图用于计算平均灰度 props = measure.regionprops(label_img, intensity_image=image) # 取面积最大的连通区域作为目标栗色区域 target_region = max(props, key=lambda x: x.area) # 提取所需属性 area = target_region.area mean_intensity = target_region.mean_intensity solidity = target_region.solidity # 输出结果 print(f"目标区域面积:{area} 像素") print(f"目标区域平均灰度:{mean_intensity:.2f}") print(f"目标区域solidity:{solidity:.4f}")
内容的提问来源于stack exchange,提问作者user3471773
相关产品推荐
相关产品推荐

