首页 > 解决方案 > skimage.util 中错误的像素值缩放(替代 Scipy 中的字节缩放)

问题描述

使用最新版本的 SciPy,该bytescale()功能已被删除。所以我尝试了 scikit-image 的替代方案。虽然bytescale()(scipy) 将正确缩放的 uint16 图像 (.tif) 转换为 uint8 图像,但util.img_as_ubyte()(skimage) 返回一个图像,其最高灰度值为 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)
...

标签: pythonimage-processingscipyscikit-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)

推荐阅读