如何在matlab中叠加图像

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在matlab中叠加图像相关的知识,希望对你有一定的参考价值。

我有两个图像,一个灰度(Img1Gray)和一个彩色(Img2RGB)。彩色图像大多为零,有几个明亮的彩色区域。我尝试将彩色图像叠加在灰度图像的顶部,这样得到的图像看起来就像没有彩色区域的地方的灰度图像,并且就像有颜色的图像一样。请注意,我需要将结果作为RGB矩阵。我在这里找到了解决方案

https://stackoverflow.com/a/21070766/3906713

Img1Gray = double(Img1Gray) ./ 255;
Img2RGB  = double(Img2RGB)  ./ 255;

ImgRez = Img2RGB;
ImgRez(:,:,1) = (1 - Img2RGB(:,:,1)) .* Img1Gray + Img2RGB(:,:,1);
ImgRez(:,:,2) = (1 - Img2RGB(:,:,2)) .* Img1Gray + Img2RGB(:,:,2);
ImgRez(:,:,3) = (1 - Img2RGB(:,:,3)) .* Img1Gray + Img2RGB(:,:,3);

imshow(ImgRes);

该代码似乎有效,但彩色区域显得比原始图像显着更苍白。如何纠正?

答案

假设RGB在点A上具有值(0.5,0,0)并且灰度在那里具有值0.5。我们感兴趣的另一点B有RGB(0.5,0,0)和灰度0.75,最后C有(0.75,0,0)和0.5灰度。选择这些点来说明方法之间的差异。

0.)你的解决方案会看到A = (0.75, 0.5, 0.5)B = (0.88, 0.75, 0.75)C = (0.88, 0.5, 0.5)。所有的点都会变得更浅红色=不是你想要的。

1.)一种解决方案是在没有RGB图像的地方设置灰度:

someRGB = any(Img2RGB > 0, 3);
ImGrayNoRGB = Img1Gray;
ImGrayNoRGB(someRGB) = 0;
ImgRez = Img2RGB;
ImgRez(:,:,1) = (1 - Img2RGB(:,:,1)) .* ImGrayNoRGB + Img2RGB(:,:,1);
ImgRez(:,:,2) = (1 - Img2RGB(:,:,2)) .* ImGrayNoRGB + Img2RGB(:,:,2);
ImgRez(:,:,3) = (1 - Img2RGB(:,:,3)) .* ImGrayNoRGB + Img2RGB(:,:,3);

最后4行可以简化为(v0中存在相同的选项):

ImgRez = (1 - Img2RGB) .* repmat(ImGrayNoRGB, [1, 1, 3]) + Img2RGB;

如果从相同的灰度图像获得RGB并且仅在高于阈值时保持颜色,则这是一个很好的解决方案,但是对于混合2个任意图像(其中灰度比RGB更亮)将产生差的结果。 A = (0.5, 0, 0)还可以,C = (0.75, 0, 0)也很好,但B = (0.5, 0, 0)现在比假设的灰度值更暗,这可能看起来很糟糕。

1b)对这种“看起来奇怪的东西”的修复是通过适当的公式(约0.2R + 0.7G + 0.1B)或简单地检查哪个值最高=> max(Img2RGB, [], 3)来检查RGB的亮度。灰度用于将最小像素亮度设置为该值。假设max,积分将是A = (0.5, 0, 0)B = (0.75, 0.25, 0.25)C = (0.75, 0, 0)

RGBbright = max(Img2RGB,[], 3); % Get brightness of the RGB image.
deltaBright = greyscale - RGBbright; % Get how much greyscale needs to be added to the RGB.
deltaBright(deltaBright < 0) = 0;
ImgRez = Img2RGB + repmat(deltaBright, [1, 1, 3]);

2.)另一种可能的解决方案是稍微修改代码中的颜色混合,因此灰度统一添加白色并保留差异 - 检查最大RGB并添加RGB只是补充:

ImgRez = (1 - max(Img2RGB,[], 3)) .* repmat(Img1Gray, [1, 1, 3]) + Img2RGB;

在这种情况下,点是A = (0.75, 0.25, 0.25)B = (0.88, 0.38, 0.38)C = (0.88, 0.13, 0.13)

现在,对于1b)和2)之间的选择,很难说要选择什么。试试两个。 2会使颜色变得有点暗淡,而且图像亮度也会突然跳跃 - 假设灰度图像均匀为0.5,红色区域在0到0.5之间变化 - 红色部分比灰色部分更亮。所以看来1b应该是更好的选择。另一方面,有颜色的更明亮的图像可能是这种混合的理想结果,有利于2。

另一答案

获取彩色图像的非零值索引,将这些值放入灰度图像中。

% Check if any of R/G/B components are non-zero
ColouredImageIdx = any( (Im2RGB > 0), 3 );
% Inidices
[idx(:,1), idx(:,2)] = ind2sub( size(ColouredImageIdx), find(ColouredImageIdx) );

% Create RGB image from grayscale image. Start by making grayscale image 3 layers
OutputImage = repmat(Im1Gray, 1, 1, 3);
% Place colours
OutputImage( idx(:,1), idx(:,2), : ) = Im2RGB( idx(:,1), idx(:,2), : );  

由于您将RGB值与某些比例的灰度值(与1-RGB值成比例)组合在一起,因此现有代码中的颜色会显得褪色。

以上是关于如何在matlab中叠加图像的主要内容,如果未能解决你的问题,请参考以下文章

请问怎么用matlab 把两幅图像叠加到一起?

求加权平均的图像融合matlab 程序

matlab imadd关于2幅图像叠加问题

matlab图像处理

基于MATLAB的多循环火焰图像识别与叠加程序

matlab中如何修改坐标轴,如图所示?