【问题标题】:Overlapping grayscale and RGB Images重叠灰度和 RGB 图像
【发布时间】:2018-02-14 04:31:13
【问题描述】:

我想重叠两张图像,一张灰度图像和一张 RGB 图像。我想将 RGB 图像强加在灰度图像之上,但仅适用于大于某个值的像素。我尝试在 MATLAB 中使用 double 函数,但这似乎改变了配色方案,我无法恢复原始的 RGB 颜色。为了保留原始 RGB 图像而不是将其映射到 MATLAB 颜色图之一,我应该怎么做?下面是我的叠加尝试:

pixelvalues = double(imread('hello.png'));
PixelInt = mean(pixelvalues,3);
I1 = ind2rgb(Brightfield(:,:,1), gray(256)); %Brightfield
I2 = ind2rgb(PixelInt, jet(256)); %RGB Image
imshow(I2,[])
[r,c,d] = size(I2);
I1 = I1(1:r,1:c,1:d);
% Replacing those pixels below threshold with Brightfield Image
threshold = 70;

I2R = I2(:,:,1); I2G = I2(:,:,2); I2B = I2(:,:,3);
I1R = I1(:,:,1); I1G = I1(:,:,2); I1B = I1(:,:,3);

I2R(PixelInt<threshold) = I1R(PixelInt<threshold);
I2G(PixelInt<threshold) = I1G(PixelInt<threshold);
I2B(PixelInt<threshold) = I1B(PixelInt<threshold);
I2(:,:,1) = I2R; I2(:,:,2) = I2G; I2(:,:,3) = I2B;

h = figure;
imshow(I2,[])

原始 RGB 图像:

明场:

叠加层

【问题讨论】:

    标签: image matlab colors rgb colormap


    【解决方案1】:

    pixelvalues 的内容是您在第一张图片中显示的内容吗?如果是这样,则该图像不使用jet 颜色图。它的粉红色和白色值高于红色值,而jet 在上限处停在深红色。当您取这些值的平均值,然后使用 jet 颜色图生成带有 ind2rgb 的新 RGB 图像时,您将创建一个本质上不同的图像。您可能想直接使用pixelvalues 来生成叠加层,如下所示:

    % Load/create your starting images:
    pixelvalues = imread('hello.png');           % Color overlay
    I1 = repmat(Brightfield(:, :, 1), [1 1 3]);  % Grayscale underlay
    [r, c, d] = size(pixelvalues);
    I1 = I1(1:r, 1:c, 1:d);
    
    % Create image mask:
    PixelInt = mean(double(pixelvalues), 3);
    threshold = 70;
    mask = repmat((PixelInt > threshold), [1 1 3]);
    
    % Combine images:
    I1(mask) = pixelvalues(mask);
    imshow(I1);
    

    请注意,在加载/创建起始图像时,您可能需要进行一些类型转换。我假设'hello.png'uint8 RGB imageBrightfielduint8 类型。如果我将您的第一张图片加载为pixelvalues,将您的第二张图片加载为I1,则在运行上述代码时会得到以下信息:

    【讨论】:

      【解决方案2】:

      创建一个蒙版并使用它来组合图像:

      onionOrig = imread('onion.png'); onionGray = rgb2gray(onionOrig); onionMask = ~(onionOrig(:,:,1)<100 & onionOrig(:,:,2)<100 & onionOrig(:,:,3)<100); onionMasked(:,:,1) = double(onionOrig(:,:,1)) .* onionMask + double(onionGray) .* ~onionMask; onionMasked(:,:,2) = double(onionOrig(:,:,2)) .* onionMask + double(onionGray) .* ~onionMask; onionMasked(:,:,3) = double(onionOrig(:,:,3)) .* onionMask + double(onionGray) .* ~onionMask; onionFinal = uint8(onionMasked); imshow(onionFinal)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 2014-02-26
        • 2014-12-22
        • 1970-01-01
        • 1970-01-01
        • 2013-09-15
        相关资源
        最近更新 更多