重叠灰度和RGB图像
问题描述:
我想重叠两个图像,一个灰度和一个RGB图像。我想将RGB图像强加在灰度图像的顶部,但只适用于大于特定值的像素。我尝试在MATLAB中使用double
函数,但是这似乎改变了配色方案,我无法恢复原来的RGB颜色。我应该怎么做才能保留原始的RGB图像,而不是将其映射到MATLAB颜色映射之一?下面是我尝试在叠加:重叠灰度和RGB图像
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图像:
明视场:
覆盖:
答
是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 image和Brightfield
是uint8
类型。
答
创建一个面具,用它来合成图像:
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)
如果我加载你的第一个形象
pixelvalues
和你作为
I1
秒形象,我运行上面的代码时,得到如下