使用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
相关产品推荐
相关产品推荐

