如何使用 skimage.exposure.equalize_adapthist() 保存 tif 图像

How to save a tif image with skimage.exposure.equalize_adapthist()

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

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 文件?

谢谢

问题是您将图像保存为 float64 数据类型。有关数据类型的更多信息,请阅读 scikit-image 文档中的 "Image data types and what they mean"。 tifffile 库会很乐意保存 float64,但许多 tiff 读者不会阅读它们。

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