2016-09-07 7 views
0

Я работаю в лаборатории, и мы часто делаем временные интервалы (изображение каждый час) стволовых клеток. Нынешняя идея состоит в том, чтобы объединить все фреймы и сделать видео, показывающее эти растущие ячейки (аналогично этому youtube video). Что можно было сделать простым и приятным с помощью OpenCV + Python.Нормализация яркости/гистограммы для изображений с временной задержкой

import numpy as np 
import os 
import cv2 

fourcc = cv2.VideoWriter_fourcc(*'XVID') 
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480)) 

timelapse_folder = '../myTimeLapse/' 

for file in os.listdir(timelapse_folder): 
    frame = cv2.imread(timelapse_folder+file, 0) 
    out.write(frame) 

out.release() 

Но у нас есть проблема, что все изображения отличаться немного яркости, поэтому мы получаем некоторое мерцание в нашем видео выход.

Я не разрешено загружать видео, но вот несколько простых примеров, сгенерированные с садомазо визуализировать проблему:

Это видео я получаю от кадров

enter image description here

и это мое желаемое видео (было бы также полезно минимизировать мерцание вместо полного его удаления)

enter image description here

Есть ли способ настроить гистограмму или яркость по всем изображениям (или, возможно, между двумя изображениями), чтобы удалить эти мерцания с помощью OpenCV?

Спасибо за любую идею или подсказку!

Edit: GIF последовательность производства идеи Эндрю (Ответ ниже)

enter image description here

+1

Предполагая, что все изображения 2D массивы поплавков/Интс, тогда вы могли бы построить 3D массив всех изображений , а затем нормализуется против самого яркого '(max (np.average (arr, axis = 2))). Затем вы переходите и записываете видео? – Andrew

+0

Эй, я пробовал 'max_avg = np.max (np.average (images, axis = 2))', а затем в цикле for над каждым фреймом 'frame = (frame/max_avg) * 255', но он не удаляет мерцание , Или вы имеете в виду другой тип нормализации? – Fabian

ответ

1

Если ваши данные находятся в трехмерном массиве, вам не нужно зацикливаться на нем, чтобы сделать это. С 5 изображениями, скажем 256 х 256, вы должны иметь возможность построить массив, который равен arr.shape == (256, 256, 5). Мой первоначальный комментарий был немного от меня, я думаю, но нижеследующий пример должен это сделать.

target_array = [] 

for file in os.listdir(timelapse_folder): 
    frame = cv2.imread(timelapse_folder+file, 0) 
    if target_array:#Not entirely happy with this, but it should work 
     target_array = np.dstack((target_array, frame)) 
    elif not target_array: 
     target_array = np.asarray(frame) 
target_array = target_array/np.max(target_array) 
#target_array *= 255 #If you want an intensity value with a more common range here 
for idx in xrange(target_array.shape[2]): 
    out.write(target_array[:, :, idx]) 

EDIT: Я использовал this page сглаживать некоторые перегибы с обращаясь к 3D массив

+0

Если у вас есть проблемы с мерцанием, вы можете добавить интерполированный срез между каждым из ваших срезов данных который находится на середине между двумя кадрами, что уменьшит видимый эффект мерцания. Не уверен, что функция сглаживания будет работать, в зависимости от количества кадров. – Andrew

+0

Эй, я попробовал ваше решение, выполняя такую ​​нормализацию между изображениями и добавляя переходы (интерполированный срез), и теперь он выглядит «Хорошо». Нормализация удаляет мерцание немного, но у меня есть некоторые проблемы с интерполированным срезом, потому что ячейки иногда не достаточно близки, так что они выглядят действительно размытыми. Я добавлю gif, созданный с идеей вашего ответа на мой вопрос, но я буду ждать с принятием - может быть, у кого-то есть другая идея. В противном случае я соглашусь через пару дней. Большое спасибо. – Fabian

+0

Если гладкость является приоритетом, вы всегда можете добавить несколько интерполированных фрагментов, которые можно выполнить во время dstack, определяя количество интерполированных фрагментов и затем создавая это количество массивов. Затем вы можете выбрать, выполнять ли линейную или логарифмическую работу (возможно, нормальное распределение с 11 срезами обеспечило бы оптимальную гладкость?). Очевидно, что ваши реальные данные будут превосходить численностью 11: 1 или около того, но пока вы откровенно относитесь к этим ученым, которые это видят, я не вижу никаких проблем. – Andrew

0

Являются ли эти изображения RGB или серые значения? Я бы просто выполнить нормализацию в цикле после прочтения каждого кадра:

frame = frame/np.max(frame) 

В случае серых значений, каждое изображение должно затем иметь значение между 0 и 1, но в зависимости от того, как изображения выглядят, как вы могли бы также попробовать другие нормировки , например используя np.median или np.mean вместо np.max.

+0

Я пробовал это, но разница яркости _between_ все изображения сохраняются. Я думаю, что мне нужно уважать среднее значение всех изображений, как писал Андрей в своем комментарии, но я не знаю, как я могу перемещать среднее значение для каждого кадра в среднем по всем кадрам. Ты знаешь, что я имею в виду? – Fabian

+0

Думаю, у меня есть твоя проблема. У вас есть какие-то объекты, которые можно отделить от фона в ваших кадрах (например,используя простой порог)? Таким образом, вы можете попытаться настроить только фон всех кадров. Например: возьмите среднее значение фона произвольного кадра в качестве ссылки и сдвиньте все остальные кадры, чтобы средние значения их фона соответствовали ссылке. –

+0

Есть ли простой метод numpy или cv2 для смещения этих значений фрейма? Ячейки не совсем белые, поэтому я думаю, что если я только отрегулирую фон, я получу мерцающие ячейки (переднем плане). В более поздних изображениях с более высокой слиянием (много ячеек) я не могу отделить фон, потому что есть только мерцающие клетки, действительно близкие друг к другу. – Fabian

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

  • Нет связанных вопросов^_^