我打开一个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语言写了一些内容,但我不明白什么是最好的(也更容易)解决方案,...我是一名食品技术专家而不是真正的程序员: - )
由于
答案 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()
基准测试提供了这些数据:
正如您所看到的,这种情况下的瓶颈是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