You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用threshold_yen、移除小孔洞与小物体无效果且无报错,求排查

问题分析与解决步骤

核心问题1:未可视化处理后的结果

你最后调用plt.imshow(img1)和plt.imshow(img2),显示的是原始灰度图像,完全没展示生成的mask和mask2,自然看不到阈值处理、形态学操作的效果。

解决:替换为对比显示原始图和处理后的mask:

# 青蛙血液结果对比
plt.figure(figsize=(12,6))
plt.subplot(121)
plt.title('Frog Blood_20x (Original)')
plt.imshow(img1, cmap='gray')
plt.subplot(122)
plt.title('Frog Blood_20x (Processed)')
plt.imshow(mask, cmap='gray')
plt.show()

# 鱼血液结果对比
plt.figure(figsize=(12,6))
plt.subplot(121)
plt.title('Fish Blood_20x (Original)')
plt.imshow(img2, cmap='gray')
plt.subplot(122)
plt.title('Fish Blood_20x (Processed)')
plt.imshow(mask2, cmap='gray')
plt.show()

核心问题2:threshold_yen函数参数错误

threshold_yen是全局阈值算法,不需要传入block_size参数(该参数属于局部阈值方法如threshold_local)。你传入的block_size会被当作直方图分箱数nbins使用,导致阈值计算偏差甚至完全错误。

解决:移除多余参数,正确调用:

threshold1 = threshold_yen(img1)
threshold2 = threshold_yen(img2)

潜在问题:形态学操作参数不合理

  • mask2的remove_small_objects设为10000,尺寸过大可能直接移除目标细胞,建议先尝试100-500区间的数值
  • mask的remove_small_holes设为10000,几乎不会移除任何孔洞;mask2设为2则可能误删有用结构,需根据实际图像的孔洞大小微调

冗余代码清理

代码中导入的pandas、PIL.Image、segmentation均未使用,可直接删除以减少冗余


修正后的完整代码示例

import matplotlib.pyplot as plt
from skimage import io, morphology
from skimage.color import rgb2gray
from scipy.ndimage import gaussian_filter
from skimage.filters import threshold_yen
import numpy as np

filepath1 = r'C:\Users\marzo\Downloads\frogblood.jpg'
filepath2 = r'C:\Users\marzo\Downloads\fishblood.jpg'

img1 = io.imread(filepath1)
img2 = io.imread(filepath2)

img1 = rgb2gray(img1)
img2 = rgb2gray(img2)

img1 = gaussian_filter(img1, sigma=1)
img2 = gaussian_filter(img2, sigma=1)

# 修正阈值函数调用
threshold1 = threshold_yen(img1)
threshold2 = threshold_yen(img2)

mask = img1 < threshold1 * 0.3
mask2 = img2 < threshold2 * 0.89

# 调整形态学参数(可根据实际图像微调)
mask = morphology.remove_small_objects(mask, 400)
mask2 = morphology.remove_small_objects(mask2, 500)
mask = morphology.remove_small_holes(mask, 100)
mask2 = morphology.remove_small_holes(mask2, 20)

# 对比显示结果
plt.figure(figsize=(12,6))
plt.subplot(121)
plt.title('Frog Blood_20x (Original)')
plt.imshow(img1, cmap='gray')
plt.subplot(122)
plt.title('Frog Blood_20x (Processed)')
plt.imshow(mask, cmap='gray')
plt.show()

plt.figure(figsize=(12,6))
plt.subplot(121)
plt.title('Fish Blood_20x (Original)')
plt.imshow(img2, cmap='gray')
plt.subplot(122)
plt.title('Fish Blood_20x (Processed)')
plt.imshow(mask2, cmap='gray')
plt.show()

内容的提问来源于stack exchange,提问作者codeman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:45:30