2016-08-16 3 views
0

открываю TIFF LAB изображение и вернуть большой 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, но на работе я должен использовать окна).

Кто-то может помочь мне сократить время разработки? Я читал о threadind, чтобы написать какую-то часть на языке C, но я не понимаю, что лучше (и проще) решение ... Я пищевик не настоящий программист :-)

Благодарности

+0

Я не знаю, будет ли он быстрее, но вы можете попробовать использовать 'tifffile' (https://pypi.python.org/pypi/tifffile). Это, безусловно, спасет вас от времени кодирования и отладки. –

+0

Я много искал, но я не нашел lib, способного читать TIFF LAB (с плавающей запятой). Спасибо – 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 не может читать файл LIF LIF, где L-канал UINT16 масштабируется в диапазоне 0-100, а a/b-канал - int16 для масштабирования в диапазон -127-128. Можно ли выполнить операцию в массиве с numpy? – dan2cil

+0

@ dan2cil Когда вы говорите, что не можете читать TIF LAB, что вы имеете в виду? Я прошу вас, потому что после проверки вашего кода было очень медленно, я просто попробовал прямо tiffflib, и я предположил, что этот [output] (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 изображение. Thank BPL

Смежные вопросы