В свободное время я работаю над небольшой проблемой, связанной с анализом некоторых изображений, полученных с помощью микроскопа.Это вафля с некоторыми вещами тут и там, и в конечном итоге я хочу создать программу для определения, когда появляются определенные материалы.
В любом случае, первый шаг - это нормализация интенсивности по всему изображению, так как линза делаетне дают равномерной молнии.В настоящее время я использую изображение без каких-либо материалов, только подложку в качестве фона или эталонное изображение.Я нахожу максимальное из трех значений (интенсивности) для 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