Наложение нескольких изображений + добавление цветовой карты

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

Изображение 1Изображение 2

Допустим, у меня есть 20 таких изображений, как я могу наложить одно поверх другого, чтобы все они были одинаково прозрачными? Тогда как я могу добавить цветовую карту, представляющую время? (Самое нижнее изображение — это один конец карты цветов, а самое последнее изображение — противоположный конец) ‹ — это чрезвычайно сложно, так как часто фон черный, а не NaN


person noah3695    schedule 09.06.2016    source источник
comment
Сделайте нижний слой 100% непрозрачным, следующий слой 50% (1/2), следующий слой 33% (1/3), следующий 25% (1/4), следующие 20% (1/5), следующие 16,6% (1/6) ... вы видите закономерность.   -  person Mark Setchell    schedule 10.06.2016
comment
См. AVERAGING IMAGES IN.... cambridgeincolour.com/tutorials/image-averaging-noise.htm   -  person Mark Setchell    schedule 10.06.2016
comment
Интересная концепция. Я предполагаю, что вы имеете в виду следующее: hImg = imshow(Mat(:,:,2)); <br/> set(hImg, 'AlphaData', 0.5); Однако исходные изображения будут казаться практически размытыми после ~ 8 итераций. Возможно ли, чтобы первое изображение стало темно-синим (нижний конец струи цветовой карты), и если количество изображений = n, иметь n-е на противоположном конце струи цветовой карты?   -  person noah3695    schedule 10.06.2016


Ответы (2)


Основная мысль

Вероятно, самый простой способ сделать это - взять бинарное изображение для каждого слоя и умножить изображение на время, когда оно было получено (или его индекс во времени). Затем вы можете объединить все изображения по третьему измерению (используя cat). Вы можете вычислить максимальное значение по третьему измерению, используя max. Это заставит новые временные точки казаться «поверх» более старых временных точек. Затем вы можете отобразить полученную сплющенную матрицу, используя imagesc, и она автоматически сопоставится с палитрой для текущей фигуры. Обычно мы называем это проекцией максимальной интенсивности.

Создание некоторых данных

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

% Create some pseudo-data in a cell array that represents the image over time
im = imread('http://i.imgur.com/xTurvfO.jpg');
im = im(:,:,1);

ims = cell(1, 5);

% Create some shifted versions of im1
shifts = round(linspace(0,1000,5));

for k = 1:numel(shifts)
    ims{k} = circshift(im > 100, shifts([k k]));
end

Реализация метода

Теперь о применении метода, который я обсуждал

% For each image, multiply the binary mask by the time
for k = 1:numel(ims)
    ims{k} = ims{k} * k;
end

% Concatenate all images along the third dimension  
IMS = cat(3, ims{:});

% Flatten by taking the maximum value along the third dimension
MIP = max(IMS, [], 3);

% Display the resulting flattened image using imagesc
imagesc(MIP);

% Create a custom colormap with black at the end to create our black background
colormap(cat(1, [0 0 0], parula))

Результат

введите здесь описание изображения

person Suever    schedule 09.06.2016

Я использовал imfuse для создания составных изображений, что похоже на объединение нескольких каналов на флуоресцентном микроскопе. Документация Mathworks находится на http://www.mathworks.com/help/images/ref/imfuse.html.

Сложная часть — это выбор вектора для цветовых каналов. Например, [2,1,2] означает выбор B (голубой) для изображения 1, R (красный) и G (красный) для изображения 2. [2,1,2] — это схема, рекомендуемая для дальтоников, и дает цифру слева от этого изображения. Использование [1,0,2] для красного/синего дает рисунок справа.

fig1 = imread([basepath filesep 'fig.jpg']);     %white --> black
fig2 = imread([basepath filesep 'fig2.jpg']);

fig_overlay = imfuse(fig1, fig2,'falsecolor','Scaling','joint', 'ColorChannels', [1,0,2]);     
imshow(fig_overlay)
person Jenny Liu    schedule 09.06.2016