首页 > 解决方案 > 如何使用 skimage.exposure.equalize_adapthist() 保存 tif 图像

问题描述

我正在研究一组显微图像,并试图为它们找到正确的阈值。我使用这些代码行:

from skimage import io, img_as_float
from skimage.restoration import denoise_nl_means, estimate_sigma
from skimage import exposur
from skimage.io import imsave

img = img_as_float(io.imread(image))
sigma_est = np.mean(estimate_sigma(img, multichannel = True))
patch_kw = dict(patch_size = 5, patch_distance = 6, multichannel = True)
denoise_img = denoise_nl_means(img, h = 15 * sigma_est, fast_mode = True,
              ** patch_kw)
eq_img = exposure.equalize_adapthist(denoise_img)
imsave("Contrast_DAPI.tif", eq_img)

当我运行这段代码时,我得到一个比我的原始图像大四倍的文件,并且它不能被包括 Python 在内的任何东西打开。如果我将格式从 tif 更改为 png,我只能保存它。但是,然后我收到此警告消息:“从 float64 到 uint8 的有损转换。范围 [0, 1]。在保存之前将图像转换为 uint8 以抑制此警告。”

有人可以帮忙吗?在这种情况下如何保存 tif 文件?

谢谢

标签: pythonimageimage-processingscikit-image

解决方案


问题是您将图像保存为 float64 数据类型。有关数据类型的更多信息,请阅读scikit-image 文档中的“图像数据类型及其含义”。tifffile 库很乐意保存 float64,但许多 tiff 阅读器不会阅读它们。

根据您的下游应用程序,您可以使用skimage.util.img_as_ubyteskimage.util.img_as_uint转换为 8 位或 16 位整数数组,然后以与您相同的方式保存。下游库会更快乐,你几乎肯定不需要 64 位浮点的完整精度——这种格式有助于将许多操作链接在一起而不会丢失精度,但如果你要计算阈值,则没有必要下一步。


推荐阅读