使用C#或MATLAB合并具有不同通道(R,G,B)的两个图像

时间:2011-01-09 09:02:49

标签: c# matlab

如何将具有不同效果的两个相同图像合并(叠加)到一个图像中。 我有一个像natural.jpg的图像, 我在natural.jpg图片中添加了一些效果 现在我想将两个相同的图像合并到一个图像中,如OutNatural.jpg图像。

我怎样才能用C#语言或Matlab实现这个目标..如果有任何其他方式然后回复我..

由于

2 个答案:

答案 0 :(得分:3)

在数学上,您可以通过平均两个图像来获得所需的结果。如果要强调一个图像或另一个图像,可以使用加权平均值。在MATLAB中:

function imgC = AverageImages(imgA, imgB, weight)
%# AverageImages - average two input images according to a specified weight.
%# The two input images must be of the same size and data type.

    if weight < 0 || weight > 1
        error('Weight out of range.')
    end
    c = class(imgA);
    if strcmp(c, class(imgB)) != 1
        error('Images should be of the same datatype.')
    end

    %# Use double matrices for averaging so we don't lose a bit
    x = double(imgA);
    y = double(imgB);
    z = weight*x + (1-weight)*y;

    imgC = cast(z, c); %# return the same datatype as the input images

实际平均值发生在行z = weight*x + (1-weight)*y;中如果指定weight = 0.5,则输出图像将是两个输入的相等混合。如果您指定0.9,则输出将为90%imgA和10%imgB

将输入图像转换为双数据类型的原因是因为图像通常为uint8,其限制为0..255。这里的简单数学不应该遇到这种数据类型的任何问题,但是在浮点数中进行数学运算然后回到图像所需的数据类型是一个好习惯。

出于美观原因,您可能希望使用不同的权重平均图像的不同区域。您可以扩展函数以接受weight的标量或2D矩阵。在后一种情况下,您只需将每个像素乘以weight矩阵中的相应条目。

答案 1 :(得分:2)

@mtrw所示,合并图像的一种方法是使用两者的线性组合。用于MATLAB的图像处理工具箱为此目的提供了两个函数,即IMADDIMLINCOMB(不幸的是,Octave的Image package没有类似的功能,尽管它们并不难自己实现)

MATLAB实现的一个优点是,在英特尔架构处理器上,他们使用IPP库来加速执行。