您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用numpy高效地将16位图像数据转换为8位进行显示,并进行强度缩放

使用numpy高效地将16位图像数据转换为8位进行显示,并进行强度缩放

要做的是半色调你的 形象。 其他人提出的方法效果很好,但它们重复了很多次一次又一次的昂贵计算。因为在“uint16”中 大多数65536个不同的值,使用查找表(LUT)可以简化很多事情。既然LUT很小,你就不用担心那么多 关于就地操作,或者不创建布尔数组。以下代码重用Bi-Rico的函数来创建LUT:

import numpy as np
import timeit

rows, cols = 768, 1024
image = np.random.randint(100, 14000,
                             size=(1, rows, cols)).astype(np.uint16)
display_min = 1000
display_max = 10000

def display(image, display_min, display_max): # copied from Bi Rico
    # Here I set copy=True in order to ensure the original image is not
    # modified. If you don't mind modifying the original image, you can
    # set copy=False or skip this step.
    image = np.array(image, copy=True)
    image.clip(display_min, display_max, out=image)
    image -= display_min
    np.floor_divide(image, (display_max - display_min + 1) / 256,
                    out=image, casting='unsafe')
    return image.astype(np.uint8)

def lut_display(image, display_min, display_max) :
    lut = np.arange(2**16, dtype='uint16')
    lut = display(lut, display_min, display_max)
    return np.take(lut, image)


>>> np.all(display(image, display_min, display_max) ==
           lut_display(image, display_min, display_max))
True
>>> timeit.timeit('display(image, display_min, display_max)',
                  'from __main__ import display, image, display_min, display_max',
                   number=10)
0.304813282062
>>> timeit.timeit('lut_display(image, display_min, display_max)',
                  'from __main__ import lut_display, image, display_min, display_max',
                  number=10)
0.0591987428298

So there is a x5 speed-up, which is not a bad thing, I guess…

其他 2022/1/1 18:25:42 有649人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶