在Python

时间:2016-08-16 13:08:02

标签: python arrays numpy image-processing

我打开一个TIFF LAB图像并使用python返回一个大的numpy数组(4928x3264x3 float64):

def readTIFFLAB(filename):
    """Read TIFF LAB and retur a float matrix
    read 16 bit (2 byte) each time without any multiprocessing
    about 260 sec"""

    import numpy as np
    ....
    ....
    # Data read
    # Matrix creation
    dim = (int(ImageLength), int(ImageWidth), int(SamplePerPixel))
    Image = np.empty(dim, np.float64)

    contatore = 0
    for address in range(0, len(StripOffsets)):
        offset = StripOffsets[address]
        f.seek(offset)
        for lung in range(0, (StripByteCounts[address]/SamplePerPixel/2)):
            v = np.array(f.read(2))
            v.dtype = np.uint16
            v1 = np.array(f.read(2))
            v1.dtype = np.int16
            v2 = np.array(f.read(2))
            v2.dtype = np.int16
            v = np.array([v/65535.0*100])
            v1 = np.array([v1/32768.0*128])
            v2 = np.array([v2/32768.0*128])
            v = np.append(v, [v1, v2])
            riga = contatore // ImageWidth
            colonna = contatore % ImageWidth
            # print(contatore, riga, colonna)
            Image[riga, colonna, :] = v
            contatore += 1
    return(Image)

但是这个例程需要大约270秒来完成所有工作并返回一个numpy数组。

我尝试使用多处理,但是不可能共享一个数组或使用队列来传递它,并且sharedmem在Windows系统中不可用(在家里我使用openSuse但在工作时我必须使用windows)。

有人可以帮我减少精心制作时间吗?我读了关于threadind的文章,用C语言写了一些内容,但我不明白什么是最好的(也更容易)解决方案,...我是一名食品技术专家而不是真正的程序员: - )

由于

2 个答案:

答案 0 :(得分:0)

哇,你的方法确实很慢,试试tifffile库,你可以找到它here。该库将以非常快的速度打开您的文件,然后您只需要进行正确的转换,这里是简单的用法:

import numpy as np
import tifffile
from skimage import color
import time
import matplotlib.pyplot as plt


def convert_to_tifflab(image):
    # divide the color channel
    L = image[:, :, 0]
    a = image[:, :, 1]
    b = image[:, :, 2]

    # correct interpretation of a/b channel
    a.dtype = np.int16
    b.dtype = np.int16

    # scale the result
    L = L / 65535.0 * 100
    a = a / 32768.0 * 128
    b = b / 32768.0 * 128

    # join the result
    lab = np.dstack([L, a, b])

    # view the image
    start = time.time()
    rgb = color.lab2rgb(lab)
    print "Lab2Rgb: {0}".format(time.time() - start)

    return rgb

if __name__ == "__main__":
    filename = '/home/cilladani1/FERRERO/Immagini Digi Eye/Test Lettura CIELAB/TestLetturaCIELAB (LAB).tif'

    start = time.time()
    I = tifffile.imread(filename)
    end = time.time()
    print "Image fetching: {0}".format(end - start)

    rgb = convert_to_tifflab(I)
    print "Image conversion: {0}".format(time.time() - end)

    plt.imshow(rgb)
    plt.show()

基准测试提供了这些数据:

  • 图片提取:0.0929999351501
  • Lab2Rgb:12.9520001411
  • 图片转换:13.5920000076

正如您所看到的,这种情况下的瓶颈是lab2rgb,它从xyz转换为rgb空间。我建议你向tifffile的作者报告一个问题,要求该功能读取你的文件格式,我相信他能够直接加速C代码。

答案 1 :(得分:0)

在做了BPL建议我之后我修改结果数组如下:

# divide the color channel
    L = I[:, :, 0]
    a = I[:, :, 1]
    b = I[:, :, 2]
# correct interpretation of a/b channel
    a.dtype = np.int16
    b.dtype = np.int16
# scale the result
    L =  L / 65535.0 * 100
    a = a / 32768.0 * 128
    b = b / 32768.0 * 128
# join the result
    lab = np.dstack([L, a, b])
# view the image
    from skimage import color
    rgb = color.lab2rgb(lab)
    plt.imshow(rgb)

所以现在更容易阅读TIFF LAB图像。 感谢BPL