skimage.util 中错误的像素值缩放(替代 Scipy 中的字节缩放)

Wrong pixel value scaling in skimage.util (alternative for bytescaling in Scipy)

在最新版本的 SciPy 中,删除了 bytescale() 功能。所以我尝试了 scikit-image 的替代方案。虽然 bytescale()(scipy) 将 uint16 图像 (.tif) 正确缩放为 uint8 图像,但 util.img_as_ubyte() (skimage) returns 最高灰度值的图像是8,最低的是 0,而不是 255 和 0。 我需要一个 uint8 图像来进行进一步的图像处理(Otsu 和 Canny 边缘检测),并且一切都与 skimage 的字节比例完美配合,但是一旦我尝试 SciPy 版本,一切都变得一团糟。

代码片段如下:

...
import numpy as np
from scipy.misc import bytescale
from skimage import io, util
def convertToByteImg(imagePath)
    image = io.imread(imagePath)
    img1 = util.img_as_ubyte(image)
    img2 = bytescale(image)
...

bytescale 始终将输入图像的范围扩展到 uint8 的最大范围 (0-255)。这有时是您想要的,但有时不是,因为您丢失了有关数据集中不同图像的相对范围的信息。在这种情况下,您的输入图像的范围必须大约在 [0, 2048] 内,而 img_as_ubyte 将范围 [0, 65535] 重新调整为 [0, 255]。

假设您想将输入图像扩展到整个范围,您需要 skimage.exposure.rescale_intensity:

from skimage import io, util, exposure

# narrow range 16-bit
image = io.imread(image_path)
# full range 16-bit
image_rescaled = exposure.rescale_intensity(image)
# full range 8-bit
image_uint8 = util.img_as_ubyte(image_rescaled)