Нормализация интенсивности изображения с использованием Python + PIL - Проблемы со скоростью

В свободное время я работаю над небольшой проблемой, связанной с анализом некоторых изображений, полученных с помощью микроскопа. Это пластина с кое-какими вещами тут и там, и в конечном итоге я хочу создать программу, которая обнаруживает, когда появляются определенные материалы.

В любом случае, первым делом нужно нормализовать интенсивность изображения, поскольку линза не дает равномерного освещения. В настоящее время я использую изображение без каких-либо предметов, только на подложке в качестве фона или эталонного изображения. Я нахожу максимальное из трех значений (интенсивности) для RGB.

from PIL import Image
from PIL import ImageDraw

rmax = 0;gmax = 0;bmax = 0;rmin = 300;gmin = 300;bmin = 300

im_old = Image.open("test_image.png")
im_back = Image.open("background.png")

maxx = im_old.size[0] #Import the size of the image
maxy = im_old.size[1]
im_new = Image.new("RGB", (maxx,maxy))


pixback = im_back.load()
for x in range(maxx):
    for y in range(maxy):
        if pixback[x,y][0] > rmax:
            rmax = pixback[x,y][0]
        if pixback[x,y][1] > gmax:
            gmax = pixback[x,y][1]
        if pixback[x,y][2] > bmax:
            bmax = pixback[x,y][2]


pixnew = im_new.load()
pixold = im_old.load()
for x in range(maxx):
    for y in range(maxy):
        r = float(pixold[x,y][0]) / ( float(pixback[x,y][0])*rmax )
        g = float(pixold[x,y][1]) / ( float(pixback[x,y][1])*gmax )
        b = float(pixold[x,y][2]) / ( float(pixback[x,y][2])*bmax )
        pixnew[x,y] = (r,g,b)

Первая часть кода определяет максимальную интенсивность КРАСНОГО, ЗЕЛЕНОГО и СИНЕГО каналов, пиксель за пикселем, фонового изображения, но это необходимо сделать только один раз.

Вторая часть берет «реальное» изображение (с материалом на нем) и нормализует КРАСНЫЙ, ЗЕЛЕНЫЙ и СИНИЙ каналы, пиксель за пикселем, в соответствии с фоном. Это занимает некоторое время, 5-10 секунд для изображения 1280x960, что слишком медленно, если мне нужно сделать это с несколькими изображениями.

Что я могу сделать, чтобы увеличить скорость? Я думал о перемещении всех изображений в несколько массивов, но не могу найти быстрого способа сделать это для изображений RGB. Я бы не стал отказываться от python, поскольку мой C ++ довольно низкоуровневый, и получение работающего кода FORTRAN, вероятно, займет больше времени, чем я мог бы сэкономить с точки зрения скорости: P

7
задан Happy 14 September 2011 в 19:54
поделиться