在matlab中融合2个以上的图像

时间:2014-08-30 23:14:00

标签: matlab image-processing

在MATLAB中,如何融合两个以上的图像?例如,我想做imfuse所做的事情,但是要超过2张图像。使用两个图像,这是我的代码:

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

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

C将是AB的融合版本。我有大约50张图片要融合。我如何实现这一目标?

3 个答案:

答案 0 :(得分:3)

你可以写一个for循环,然后只需要一个存储所有融合结果的图像,并反复将这个图像与你读入的新图像融合。这样,假设你的图像是从file1.jpgfile50.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 :(得分:1)

使用imfuse方法的

'blend'会在两张图片上执行Alpha混合。在图像上没有alpha通道的情况下,这只不过是每对相应像素的算术平均值。因此,解释N个图像融合的一种方法是简单地平均N个对应的像素,每个图像一个,得到输出图像。

假设:

  • 所有图片的尺寸均为imgSize(例如[480,640])
  • 所有图像都具有相同的像素值范围(例如,对于uint8为0-255或对于双倍为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中,并且可能需要转换回适合您图像的类型。

答案 2 :(得分:0)

对于rayryeng的解决方案的小猪支持: 你想要做的是增加每一步的alpha值,与图像对已存储图像的贡献程度成比例。例如:

将1张图像添加到1张现有图像中,您需要0.5的alpha值才能使它们相等。

现在将一个图像添加到2个现有图像中,它应该为图像贡献33%,因此α为0.33。第四张图像应该贡献25%(Alpha = 0.25),依此类推。

结果遵循x^-1趋势。所以在第20张图片1/20 = 0.05,所以需要0.05的alpha值。