我有两张图片,一张灰度(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);
代码似乎有效,但彩色区域显得比原始图像显得更苍白。如何纠正?
答案 0 :(得分: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值成比例)组合在一起,因此现有代码中的颜色会显得褪色。
答案 1 :(得分:2)
假设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
)或简单地检查哪个值是最高=>来检查RGB的亮度。 max(Img2RGB, [], 3)
。灰度用于将最小像素亮度设置为该值。假设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。