2014-08-30 3 views
3

В MATLAB, как мне слить более двух изображений? Например, я хочу сделать то, что делает imfuse, но для более чем двух изображений. Использование двух изображений, это код у меня есть:слияние более 2 изображений в matlab

A = imread('file1.jpg'); 
B = imread('file2.jpg'); 

C = imfuse(A,B,'blend','Scaling','joint'); 

C будет слит версия A и B. У меня есть около 50 изображений. Как мне это достичь?

ответ

4

Вы можете написать for петли, а затем просто одно изображения, которое хранит все плавленые результаты и неоднократно фьюзинг этого изображения с новым изображением вы читаете. Как, например, скажем, ваши изображения были названы из file1.jpg в file50.jpg , Вы могли бы сделать что-то вроде этого:

A = imread('file1.jpg'); 
for idx = 2 : 50 
    B = imread(['file' num2str(idx) '.jpg']); %// Read in the next image 
    A = imfuse(A, B, 'blend', 'Scaling', 'joint'); %// Fuse and store into A 
end 

Что выше код будет делать то, что он будет повторно прочитать в следующем изображении, и сплавить его с изображением, хранящимся в A. На каждой итерации он займет то, что в настоящее время находится в A, закрепите его новым изображением, затем сохраните его обратно в A. Таким образом, по мере того, как мы продолжаем читать изображения, мы будем продолжать сплавлять новые изображения поверх тех изображений, которые были сплавлены ранее. После этого петля for закончится, у вас будет 50 изображений, которые все слиты вместе.

+1

Я не уверен, что даст вам желаемые результаты. В качестве иллюстрации возьмите 50 изображений в оттенках серого с одинаковыми диапазонами оттенков серого.Предположим, что значение оттенков серого для пикселя в '(p, q)' равно нулю для изображений 1-49, но на изображении 50 значение равно 100. Используя ваш метод, результирующее значение для пикселя '(p, q)' будет '50'. Но вполне разумно ожидать, что значение должно быть «2». – beaker

+0

@beaker - Это очень верно. Это был выстрел, и я сказал, что это может работать. Я не был уверен, действительно ли это будет честью! Это была неудачная попытка, но я хочу посмотреть, что говорит OP, и если это сработает. Я действительно не знаю, как работает «imfuse», вероятно, я должен был взглянуть на документы перед тем, как написать ответ. – rayryeng

+0

Согласен, желаемые результаты четко не указаны. Мне любопытно посмотреть, что говорит OP. – beaker

1

imfuse с использованием метода 'blend' выполняет альфа-смешивание на двух изображениях. В отсутствие альфа-канала на изображениях это не более чем среднее арифметическое каждой пары соответствующих пикселей. Поэтому одним из способов интерпретации слияния N изображений является просто среднее N соответствующих пикселей, по одному от каждого изображения, для получения выходного изображения.

Если предположить, что:

  • Все изображения имеют размер imgSize (например, [480,640])
  • Все изображения имеют диапазон же значений пикселей (например, 0-255 для uint8 или 0-1 для двойной)

следующее должно дать вам что-то разумное:

numImages = 50; 
A = zeros(imgSize,'double'); 

for idx = 1:numImages 
    % Borrowing rayryeng's nice filename construction 
    B = imread(['file' num2str(idx) '.jpg']); 
    A = A + double(B); 
end 

A = A/numImages; 

Результат будет в массиве A с типом double после цикла и, возможно, его нужно будет отбросить до нужного типа для вашего изображения.

0

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

Добавив 1 изображение в 1 существующее изображение, вам понадобится альфа 0,5, чтобы они были равны.

Теперь добавив одно изображение к 2 существующим изображениям, оно должно внести 33% изображения и, следовательно, альфа 0.33. 4-е изображение должно вносить 25% (альфа = 0,25) и так далее.

Результат соответствует тренду x^-1. Таким образом, на 20-м изображении 1/20 = 0.05, так что понадобится альфа 0,05.

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