在MATLAB中,如何融合两个以上的图像?例如,我想做imfuse
所做的事情,但是要超过2张图像。使用两个图像,这是我的代码:
A = imread('file1.jpg');
B = imread('file2.jpg');
C = imfuse(A,B,'blend','Scaling','joint');
C
将是A
和B
的融合版本。我有大约50张图片要融合。我如何实现这一目标?
答案 0 :(得分:3)
你可以写一个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 :(得分:1)
imfuse
方法的 'blend'
会在两张图片上执行Alpha混合。在图像上没有alpha通道的情况下,这只不过是每对相应像素的算术平均值。因此,解释N个图像融合的一种方法是简单地平均N个对应的像素,每个图像一个,得到输出图像。
假设:
imgSize
(例如[480,640])以下内容应该给你一些合理的信息:
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值。