2016-08-16 49 views
0

非常大陣我打開一個TIFF LAB圖像,並使用python使用此函數返回一個大numpy的陣列(4928x3264x3 float64):闡述在Python

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

我不知道它是否會更快,但你可以嘗試使用'tifffile'(https://pypi.python.org/pypi/tifffile)。它肯定會爲你節省一些編碼和調試時間。 –

+0

我搜索了很多,但我沒有找到任何能夠讀取TIFF LAB(float16編碼)的庫。感謝 – dan2cil

+0

@ dan2cil如果你分享你的輸入數據,我們可以給它一個提高你的算法 – BPL

回答

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代碼。

+0

tifffile無法讀取TIF LAB文件,其中L通道是UINT16,要縮放範圍0-100,a/b通道是int16,要縮放範圍-127-128。有可能在數組中使用numpy進行操作嗎? – dan2cil

+0

@ dan2cil當你說不能讀TIF LAB時,你是什麼意思?我檢查你的代碼後,我問你真的很慢我只是直接嘗試tiffflib,我認爲這[輸出](http://screencast.com/t/GabBDMbTB)是你已經鏈接。你有沒有正確輸出的例子? – BPL

+0

正確結果的一些示例在我的例程結束時,如:aa [470,380,:]將爲[26.09,1.62,0.22]。但是,按照你的例子,我將能夠解決我閱讀後改變數據的問題。我儘快寫出我的解決方案 – dan2cil

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