Histolab 病理切片可视化完全指南:从缩略图、组织掩膜到 tile 位置预览与质量评估
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
导读
本文以 Histolab(scientific-agent-skills 仓库中面向数字病理 WSI 处理的 Agent Skill)的官方参考文档 visualization.md 为核心,系统讲解如何对整张病理切片(Whole Slide Image, WSI)进行可视化验证:从最基础的缩略图展示、组织掩膜(tissue mask)叠加,到 tile 提取前的locate_tiles()位置预览、提取后的质量评估,再到多切片对比、过滤效果可视化以及高分辨率导出与 PDF 报告。读完本文,你将掌握一套完整的"先可视化、后提取、再质检"的数字病理预处理工作流,能够用 Histolab 验证与调试自己的 WSI 分析管线。
为什么可视化是 WSI 处理的关键环节
Histolab 面向的是 gigapixel 级别的整张病理切片:一张典型的.svs文件在 level 0 下可能是 100000×100000 像素级别的数据,无法直接目检。因此,Histolab 提供了Slide对象的缩略图(thumbnail)、掩膜定位(locate_mask())和 tile 定位(locate_tiles())等一系列内建可视化能力,用于:
- 验证预处理管线:在正式提取前确认组织检测、掩膜与过滤参数是否正确;
- 调试提取问题:直观看到 tile 落在背景上、tile 尺寸是否合适、掩膜是否漏掉组织;
- 呈现结果:将提取结果、评分分布、切片集合制作成论文级图件与报告。
这正对应 Histolab Skill 文档中反复强调的最佳实践:Always preview before processing(处理前永远先预览)。相关能力在 SKILL.md 中被列为六大核心能力之一,并在 core_capabilities.md 中给出了完整的示例工作流。本文聚焦其中的可视化部分,并以 tile_extraction.md、tissue_masks.md、filters_preprocessing.md 等参考文档作为深化佐证。
上图完整展示了 Histolab 从输入slide.svs(含 level 0-4 金字塔结构)、经TissueMask与Compose过滤链生成组织掩膜、通过locate_tiles()在缩略图上预览 tile 位置,再到RandomTiler/GridTiler/ScoreTiler三种策略输出tiles/*.png与report.csv的完整管线,也是本文所有可视化操作所围绕的全局上下文。
环境准备与基本约定
本 Skill 基于 Histolab 0.7.0,要求 Python 3.8–3.11、Linux 或 macOS 环境,并需先安装 OpenSlide 系统库:
uv pip install histolab如需使用histolab.data内置的 TCGA 示例切片(前列腺、卵巢、乳腺、心脏、肾脏组织),还需安装 pooch:
uv pip install poochfrom histolab.data import prostate_tissue prostate_svs, prostate_path = prostate_tissue() slide = Slide(prostate_path, processed_path="output/")本文后续示例统一使用:
from histolab.slide import Slide slide = Slide("slide.svs", processed_path="output/")可视化所需依赖:matplotlib(绘图)、PIL(读取 tile 图片)、pandas+seaborn(评分分布分析)、ipywidgets(Jupyter 交互)。关于Slide的初始化参数(path、processed_path、use_largeimage)、维度、金字塔层级等属性,可参考 slide_management.md。
切片级可视化:缩略图、保存与缩放
缩略图展示
Slide.thumbnail是 Histolab 提供的默认缩略图属性,适合快速目检整张切片:
from histolab.slide import Slide import matplotlib.pyplot as plt slide = Slide("slide.svs", processed_path="output/") # Display thumbnail plt.figure(figsize=(10, 10)) plt.imshow(slide.thumbnail) plt.title(f"Slide: {slide.name}") plt.axis('off') plt.show()保存缩略图到磁盘
把缩略图落盘是文档记录与人工复核的标准做法,slide.name为不含扩展名的切片文件名:
from pathlib import Path Path(slide.processed_path).mkdir(parents=True, exist_ok=True) slide.thumbnail.save(Path(slide.processed_path) / f"{slide.name}_thumbnail.png")这也是 SKILL.md "Slide Loading and Inspection" 最佳实践中明确推荐的一步:"Save thumbnails withslide.thumbnail.save()for quick visual review"。
缩放图像(Scaled Images)
当你需要比默认缩略图更高或更低的分辨率来观察细节时,使用scaled_image()按降采样倍率获取指定尺度下的整图:
# Get scaled version of slide at specific downsample factor scaled_img = slide.scaled_image(scale_factor=32) plt.imshow(scaled_img) plt.title(f"Slide at 32x downsample") plt.show()scale_factor=32表示将 level 0 原始分辨率缩小 32 倍。结合 slide_management.md 中的金字塔层级知识(level 0 为最高分辨率,level 1+ 逐级降低),可先遍历slide.levels与slide.level_downsamples确定各层级降采样比例,再选择与目标分析分辨率匹配的缩放倍率。
组织掩膜可视化
使用 locate_mask() 快速叠加
掩膜是 tile 提取正确性的根基。slide.locate_mask(mask)会在切片缩略图上以红色边界叠加掩膜轮廓,一行代码即可完成校验:
from histolab.masks import TissueMask, BiggestTissueBoxMask # Visualize TissueMask tissue_mask = TissueMask() slide.locate_mask(tissue_mask) # Visualize BiggestTissueBoxMask biggest_mask = BiggestTissueBoxMask() slide.locate_mask(biggest_mask)This displays the slide thumbnail with mask boundaries overlaid in red.
关于两种掩膜的本质区别,可参考 tissue_masks.md:
TissueMask:对灰度图执行 Otsu 阈值分割,经膨胀连接邻近组织、填补小孔、移除小物体(伪影),返回所有组织区域的完整二值掩膜,适用于多组织块切片;BiggestTissueBoxMask:基于同一套过滤管线,但只保留最大连通组织区域的外接包围盒,用于单一主组织切片,同时是多数 tiler 的默认extraction_mask。
手动绘制掩膜:三图并排对比
locate_mask()适合快速复核,而手动可视化可以同时展示原图、二值掩膜与叠加效果,便于生成报告图:
import matplotlib.pyplot as plt from histolab.masks import TissueMask slide = Slide("slide.svs", processed_path="output/") mask = TissueMask() # Generate mask mask_array = mask(slide) # Create side-by-side comparison fig, axes = plt.subplots(1, 3, figsize=(20, 7)) # Original thumbnail axes[0].imshow(slide.thumbnail) axes[0].set_title("Original Slide") axes[0].axis('off') # Binary mask axes[1].imshow(mask_array, cmap='gray') axes[1].set_title("Tissue Mask") axes[1].axis('off') # Overlay mask on thumbnail from matplotlib.colors import ListedColormap overlay = slide.thumbnail.copy() axes[2].imshow(overlay) axes[2].imshow(mask_array, cmap=ListedColormap(['none', 'red']), alpha=0.3) axes[2].set_title("Mask Overlay") axes[2].axis('off') plt.tight_layout() plt.show()注意二值掩膜使用cmap='gray',叠加层使用ListedColormap(['none', 'red'])将非组织区域设为透明、组织区域渲染为半透明红色,这在 visualization.md 的最佳实践中被明确为"按语义选择 colormap"的规范。
多掩膜横向对比
当需要在TissueMask与BiggestTissueBoxMask之间做取舍(例如判断切片属于单组织块还是多组织块)时,可以用字典组织掩膜并并排渲染:
from histolab.masks import TissueMask, BiggestTissueBoxMask masks = { 'TissueMask': TissueMask(), 'BiggestTissueBoxMask': BiggestTissueBoxMask() } fig, axes = plt.subplots(1, len(masks) + 1, figsize=(20, 6)) # Original axes[0].imshow(slide.thumbnail) axes[0].set_title("Original") axes[0].axis('off') # Each mask for idx, (name, mask) in enumerate(masks.items(), 1): mask_array = mask(slide) axes[idx].imshow(mask_array, cmap='gray') axes[idx].set_title(name) axes[idx].axis('off') plt.tight_layout() plt.show()如果你对TissueMask的默认过滤链不满意(例如染色的 H&E 与 IHC 阈值差异较大),还可以像 tissue_masks.md 中那样传入自定义filters列表构造掩膜,再对定制前后的掩膜做同样的可视化对比:
from histolab.filters.image_filters import RgbToGrayscale, OtsuThreshold from histolab.filters.morphological_filters import BinaryDilation, RemoveSmallHoles custom_mask = TissueMask( filters=[ RgbToGrayscale(), OtsuThreshold(), BinaryDilation(disk_size=5), RemoveSmallHoles(area_threshold=500) ] )tile 位置预览:locate_tiles() 与自定义绘制
使用 locate_tiles() 预览
在真正提取之前,永远先调用locate_tiles()预览 tile 位置,这是 Histolab 使用铁律。三种 tiler 均可直接调用该方法,切片缩略图上会以彩色矩形标出即将被提取的 tile:
from histolab.tiler import RandomTiler, GridTiler, ScoreTiler from histolab.scorer import NucleiScorer # RandomTiler preview random_tiler = RandomTiler( tile_size=(512, 512), n_tiles=50, level=0, seed=42 ) random_tiler.locate_tiles(slide, n_tiles=20) # GridTiler preview grid_tiler = GridTiler( tile_size=(512, 512), level=0 ) grid_tiler.locate_tiles(slide) # ScoreTiler preview score_tiler = ScoreTiler( tile_size=(512, 512), n_tiles=30, scorer=NucleiScorer() ) score_tiler.locate_tiles(slide, n_tiles=15)这里展示 colored rectangles on the slide thumbnail indicating where tiles will be extracted.
结合 tile_extraction.md 的参数说明,预览前应确认以下共同参数是否符合预期:
| 参数 | 默认值 | 含义与建议 |
|---|---|---|
tile_size | (512, 512) | tile 的像素尺寸(宽,高),需匹配切片分辨率 |
level | 0 | 金字塔层级,0 为最高分辨率,1/2 层更快 |
check_tissue | True | 是否按组织含量过滤 tile |
tissue_percent | 80.0 | 最小组织覆盖率(0-100),典型 70-90 |
pixel_overlap | 0 | 相邻 tile 重叠像素(仅 GridTiler) |
extraction_mask | BiggestTissueBoxMask() | 限定提取区域的掩膜 |
RandomTiler额外支持seed(可复现)与n_tiles(提取数量);ScoreTiler需要scorer参数(如NucleiScorer、CellularityScorer或自定义Scorer子类),并按评分取前n_tiles个 tile。
自定义 tile 位置可视化
locate_tiles()足够日常使用,但当你需要精确控制矩形样式、缩放换算或集成到自定义报告布局时,可以手动在缩略图上绘制矩形框。核心要点是把 level 0 坐标除以缩略图与原始图像的缩放比,换算到缩略图坐标系:
import matplotlib.pyplot as plt import matplotlib.patches as patches from histolab.tiler import RandomTiler slide = Slide("slide.svs", processed_path="output/") tiler = RandomTiler(tile_size=(512, 512), n_tiles=30, seed=42) # Get thumbnail and scale factor thumbnail = slide.thumbnail scale_factor = slide.dimensions[0] / thumbnail.size[0] # Generate tile coordinates (without extracting) fig, ax = plt.subplots(figsize=(12, 12)) ax.imshow(thumbnail) ax.set_title("Tile Locations Preview") ax.axis('off') # Manually add rectangles for each tile location # Note: This is conceptual - actual implementation would retrieve coordinates from tiler tile_coords = [] # Would be populated by tiler logic for coord in tile_coords: x, y = coord[0] / scale_factor, coord[1] / scale_factor w, h = 512 / scale_factor, 512 / scale_factor rect = patches.Rectangle((x, y), w, h, linewidth=2, edgecolor='red', facecolor='none') ax.add_patch(rect) plt.show()文档明确说明此例为概念性代码:实际的坐标列表应由 tiler 的内部逻辑填充(例如随机采样的命中坐标),其完整坐标来源与提取实现以 tiler 的locate_tiles/extract流程为准。使用中建议优先依赖内建locate_tiles()保证坐标系一致。
提取后 tile 的可视化
展示已提取的 tile
提取完成后,直接从processed_path读取 PNG 并按网格陈列,是检查提取质量最直观的手段:
from pathlib import Path from PIL import Image import matplotlib.pyplot as plt tile_dir = Path("output/tiles/") tile_paths = list(tile_dir.glob("*.png"))[:16] # First 16 tiles fig, axes = plt.subplots(4, 4, figsize=(12, 12)) axes = axes.ravel() for idx, tile_path in enumerate(tile_paths): tile_img = Image.open(tile_path) axes[idx].imshow(tile_img) axes[idx].set_title(tile_path.stem, fontsize=8) axes[idx].axis('off') plt.tight_layout() plt.show()生成 tile 马赛克(Mosaic)
把函数封装成可复用的马赛克生成器,并在导出时设置dpi=150与bbox_inches='tight',可直接输出用于数据集概览的合成图:
def create_tile_mosaic(tile_dir, grid_size=(4, 4)): """Create mosaic of tiles.""" tile_paths = list(Path(tile_dir).glob("*.png"))[:grid_size[0] * grid_size[1]] fig, axes = plt.subplots(grid_size[0], grid_size[1], figsize=(16, 16)) for idx, tile_path in enumerate(tile_paths): row = idx // grid_size[1] col = idx % grid_size[1] tile_img = Image.open(tile_path) axes[row, col].imshow(tile_img) axes[row, col].axis('off') plt.tight_layout() plt.savefig("tile_mosaic.png", dpi=150, bbox_inches='tight') plt.show() create_tile_mosaic("output/tiles/", grid_size=(5, 5))tile 与其组织掩膜的叠加
Histolab 的Tile对象内置calculate_tissue_mask()与tissue_ratio属性,可以直接对单张 tile 做组织含量自检。把原图、掩膜、叠加三层并列展示,可确认每张 tile 中实际包含的组织比例是否满足下游训练要求:
from histolab.tile import Tile import matplotlib.pyplot as plt # Assume we have a tile object tile = Tile(image=pil_image, coords=(x, y)) # Calculate tissue mask tile.calculate_tissue_mask() fig, axes = plt.subplots(1, 3, figsize=(15, 5)) # Original tile axes[0].imshow(tile.image) axes[0].set_title("Original Tile") axes[0].axis('off') # Tissue mask axes[1].imshow(tile.tissue_mask, cmap='gray') axes[1].set_title(f"Tissue Mask ({tile.tissue_ratio:.1%} tissue)") axes[1].axis('off') # Overlay axes[2].imshow(tile.image) axes[2].imshow(tile.tissue_mask, cmap='Reds', alpha=0.3) axes[2].set_title("Overlay") axes[2].axis('off') plt.tight_layout() plt.show()tissue_ratio直接反映该 tile 的组织占比,是判断tissue_percent阈值是否合理的可视化依据。
质量评估可视化
tile 评分分布
使用ScoreTiler.extract(slide, report_path="tiles_report.csv")会额外产出 CSV 报告(含tile_name, x_coord, y_coord, level, score, tissue_percent,格式详见 tile_extraction.md)。读取报告即可绘制评分直方图与"组织占比 vs 评分"散点图,从统计层面评估提取质量:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # Load tile report from ScoreTiler report_df = pd.read_csv("tiles_report.csv") # Score distribution histogram plt.figure(figsize=(10, 6)) plt.hist(report_df['score'], bins=30, edgecolor='black', alpha=0.7) plt.xlabel('Tile Score') plt.ylabel('Frequency') plt.title('Distribution of Tile Scores') plt.grid(axis='y', alpha=0.3) plt.show() # Score vs tissue percentage scatter plt.figure(figsize=(10, 6)) plt.scatter(report_df['tissue_percent'], report_df['score'], alpha=0.5) plt.xlabel('Tissue Percentage') plt.ylabel('Tile Score') plt.title('Tile Score vs Tissue Coverage') plt.grid(alpha=0.3) plt.show()当分布出现"双峰"或"大量低分 tile"时,通常意味着tissue_percent阈值偏低或scorer与任务不匹配(评分器工作原理见 tile_extraction.md 的NucleiScorer/CellularityScorer小节)。
最高分与最低分 tile 对比
把报告按score降序排序,同时展示 top 8 与 bottom 8 的 tile 图像及对应评分,是定位"哪些区域被选中、哪些区域被丢弃"的最直接手段:
import pandas as pd from PIL import Image import matplotlib.pyplot as plt # Load tile report report_df = pd.read_csv("tiles_report.csv") report_df = report_df.sort_values('score', ascending=False) # Top 8 tiles top_tiles = report_df.head(8) # Bottom 8 tiles bottom_tiles = report_df.tail(8) fig, axes = plt.subplots(2, 8, figsize=(20, 6)) # Display top tiles for idx, (_, row) in enumerate(top_tiles.iterrows()): tile_img = Image.open(f"output/tiles/{row['tile_name']}") axes[0, idx].imshow(tile_img) axes[0, idx].set_title(f"Score: {row['score']:.3f}", fontsize=8) axes[0, idx].axis('off') # Display bottom tiles for idx, (_, row) in enumerate(bottom_tiles.iterrows()): tile_img = Image.open(f"output/tiles/{row['tile_name']}") axes[1, idx].imshow(tile_img) axes[1, idx].set_title(f"Score: {row['score']:.3f}", fontsize=8) axes[1, idx].axis('off') axes[0, 0].set_ylabel('Top Scoring', fontsize=12) axes[1, 0].set_ylabel('Bottom Scoring', fontsize=12) plt.tight_layout() plt.savefig("score_comparison.png", dpi=150, bbox_inches='tight') plt.show()这份对比图同时服务于 SKILL.md 质量控制最佳实践中的"Review score distributions"与"Inspect top and bottom scoring tiles"两条建议。
多切片可视化
切片集合缩略图
批量处理前,把整个目录的切片缩略图铺成 3×3 网格,可以在几秒钟内完成全数据集的目检(是否存在空白切片、组织方向、染色差异):
from pathlib import Path from histolab.slide import Slide import matplotlib.pyplot as plt slide_dir = Path("slides/") slide_paths = list(slide_dir.glob("*.svs"))[:9] fig, axes = plt.subplots(3, 3, figsize=(15, 15)) axes = axes.ravel() for idx, slide_path in enumerate(slide_paths): slide = Slide(slide_path, processed_path="output/") axes[idx].imshow(slide.thumbnail) axes[idx].set_title(slide.name, fontsize=10) axes[idx].axis('off') plt.tight_layout() plt.savefig("slide_collection.png", dpi=150, bbox_inches='tight') plt.show()组织覆盖率对比
对每个切片应用TissueMask(),用mask.sum() / mask.size * 100计算组织覆盖率并绘制柱状图,可快速筛选"组织过少"的问题切片,也是数据集质控的标准统计手段:
from pathlib import Path from histolab.slide import Slide from histolab.masks import TissueMask import matplotlib.pyplot as plt import numpy as np slide_paths = list(Path("slides/").glob("*.svs")) tissue_percentages = [] slide_names = [] for slide_path in slide_paths: slide = Slide(slide_path, processed_path="output/") mask = TissueMask()(slide) tissue_pct = mask.sum() / mask.size * 100 tissue_percentages.append(tissue_pct) slide_names.append(slide.name) # Bar plot plt.figure(figsize=(12, 6)) plt.bar(range(len(slide_names)), tissue_percentages) plt.xticks(range(len(slide_names)), slide_names, rotation=45, ha='right') plt.ylabel('Tissue Coverage (%)') plt.title('Tissue Coverage Across Slides') plt.grid(axis='y', alpha=0.3) plt.tight_layout() plt.show()过滤效果可视化
过滤前后对比
滤镜是组织检测与预处理的核心。用Compose组合滤镜管线后,在同一张图上并排展示"原始缩略图 vs 过滤结果",可以直接验证灰度化 + 直方图均衡化的实际效果:
from histolab.filters.image_filters import RgbToGrayscale, HistogramEqualization from histolab.filters.compositions import Compose # Define filter pipeline filter_pipeline = Compose([ RgbToGrayscale(), HistogramEqualization() ]) # Original vs filtered fig, axes = plt.subplots(1, 2, figsize=(12, 6)) axes[0].imshow(slide.thumbnail) axes[0].set_title("Original") axes[0].axis('off') filtered = filter_pipeline(slide.thumbnail) axes[1].imshow(filtered, cmap='gray') axes[1].set_title("After Filtering") axes[1].axis('off') plt.tight_layout() plt.show()多步过滤过程可视化
调试形态学过滤链时(例如判断膨胀核大小、小物体移除阈值是否合适),把每一步的输出横向展开,逐级观察从灰度 → Otsu 二值 → 膨胀 → 去小物体 的演变,能精准定位"哪一步引入了问题":
from histolab.filters.image_filters import RgbToGrayscale, OtsuThreshold from histolab.filters.morphological_filters import BinaryDilation, RemoveSmallObjects # Individual filter steps steps = [ ("Original", None), ("Grayscale", RgbToGrayscale()), ("Otsu Threshold", Compose([RgbToGrayscale(), OtsuThreshold()])), ("After Dilation", Compose([RgbToGrayscale(), OtsuThreshold(), BinaryDilation(disk_size=5)])), ("Remove Small Objects", Compose([RgbToGrayscale(), OtsuThreshold(), BinaryDilation(disk_size=5), RemoveSmallObjects(area_threshold=500)])) ] fig, axes = plt.subplots(1, len(steps), figsize=(20, 4)) for idx, (title, filter_fn) in enumerate(steps): if filter_fn is None: axes[idx].imshow(slide.thumbnail) else: result = filter_fn(slide.thumbnail) axes[idx].imshow(result, cmap='gray') axes[idx].set_title(title, fontsize=10) axes[idx].axis('off') plt.tight_layout() plt.show()这也印证了 filters_preprocessing.md 中"Preview filters: visualize filter outputs on thumbnails before applying to tiles"的实践建议——过滤器实际是可组合、可链式调用的函数对象,Compose保证了每一步的输出类型与下一步输入兼容。
导出:高分辨率图件与 PDF 报告
高分辨率导出
论文投稿或对外汇报需要 300 DPI 级别的高清图。关键在于使用dpi=300搭配bbox_inches='tight'、pad_inches=0去除多余留白:
# Export high-resolution figure fig, ax = plt.subplots(figsize=(20, 20)) ax.imshow(slide.thumbnail) ax.axis('off') plt.savefig("slide_high_res.png", dpi=300, bbox_inches='tight', pad_inches=0) plt.close()多页 PDF 报告
使用matplotlib.backends.backend_pdf.PdfPages可以按页组织"切片缩略图 → 组织掩膜 → tile 位置预览"的完整检查报告,适合批量生成每张切片的质控文档:
from matplotlib.backends.backend_pdf import PdfPages # Create multi-page PDF report with PdfPages('slide_report.pdf') as pdf: # Page 1: Slide thumbnail fig1, ax1 = plt.subplots(figsize=(10, 10)) ax1.imshow(slide.thumbnail) ax1.set_title(f"Slide: {slide.name}") ax1.axis('off') pdf.savefig(fig1, bbox_inches='tight') plt.close() # Page 2: Tissue mask fig2, ax2 = plt.subplots(figsize=(10, 10)) mask = TissueMask()(slide) ax2.imshow(mask, cmap='gray') ax2.set_title("Tissue Mask") ax2.axis('off') pdf.savefig(fig2, bbox_inches='tight') plt.close() # Page 3: Tile locations fig3, ax3 = plt.subplots(figsize=(10, 10)) tiler = RandomTiler(tile_size=(512, 512), n_tiles=30) tiler.locate_tiles(slide) pdf.savefig(fig3, bbox_inches='tight') plt.close()注意第 3 页中locate_tiles()会自行在缩略图上绘制 tile 矩形,因此无需手动叠加补丁;RandomTiler的完整参数(seed、check_tissue、tissue_percent等)同样适用于此处。
Jupyter 中的交互式可视化
对于参数探索场景(例如确定形态学操作的disk_size),可以用ipywidgets的@interact装饰器把过滤管线变成实时可调的控件。拖动滑块即可观察不同膨胀核尺寸对组织掩膜的影响:
from ipywidgets import interact, IntSlider import matplotlib.pyplot as plt from histolab.filters.morphological_filters import BinaryDilation @interact(disk_size=IntSlider(min=1, max=20, value=5)) def explore_dilation(disk_size): """Interactive dilation exploration.""" filter_pipeline = Compose([ RgbToGrayscale(), OtsuThreshold(), BinaryDilation(disk_size=disk_size) ]) result = filter_pipeline(slide.thumbnail) plt.figure(figsize=(10, 10)) plt.imshow(result, cmap='gray') plt.title(f"Binary Dilation (disk_size={disk_size})") plt.axis('off') plt.show()同样的交互模式可以推广到tissue_percent、RemoveSmallObjects.area_threshold、AdaptiveThreshold的block_size/offset等参数调优(各滤镜的参数语义详见 filters_preprocessing.md)。
最佳实践清单
- Always preview before processing:使用缩略图与
locate_tiles()验证设置,提取前务必预览 tile 位置; - Use side-by-side comparisons:滤镜效果用并排前后对比呈现;
- Label clearly:图件一律包含标题、坐标轴标签与图例;
- Export high-resolution:发表级图件使用 300 DPI;
- Save intermediate visualizations:保存中间过程图,记录每个处理步骤,便于追溯与汇报;
- Use colormaps appropriately:
'gray'用于二值掩膜,'viridis'用于热力图,透明叠加用ListedColormap/Reds; - Create reusable visualization functions:把马赛克、多切片对比、评分对比封装为函数,跨项目统一报告样式。
小结
可视化贯穿 Histolab WSI 处理的全生命周期:切片加载后用缩略图建立整体认知,掩膜阶段用locate_mask()与并排对比验证组织分割,提取前用locate_tiles()预览 tile 落点,提取后用 tile 网格、马赛克与tissue_ratio自检质量,再用ScoreTiler报告做评分分布与高低分对比的统计评估,最后通过多切片对比、过滤链过程可视化与 300 DPI/PDF 导出形成完整质控闭环。这套方法论可直接落地到深度学习训练集构建、整张切片分析、数据集筛选等真实场景(应用案例见 SKILL.md 的 Common Use Cases 与 typical_workflows.md),帮助你以最低成本发现数据与管线问题,避免在错误数据上浪费算力。
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考