显示图像中的红绿色和蓝黄色对手颜色通道

时间:2020-05-01 21:48:56

标签: image-processing plot colors octave

我正在执行一个图像处理代码,以从基于R,G和B通道的图像中分割对手的颜色 Red-Green Blue-Yellow 。我在Octave软件中执行此操作。实际上,我基于以下与视觉注意力建模有关的文章:Itti1998GaoVasconcelos2007Heinen2009。这段代码说明了我如何提取频道:

clc
rgbNormImage = im2double(imread('sample.jpg'));
Rn = rgbNormImage(:, :, 1); %red normalized channel
Gn = rgbNormImage(:, :, 2); %green normalized channel
Bn = rgbNormImage(:, :, 3); %blue normalized channel

R = Rn - ( Gn + Bn )/2; %tuned Red
G = Gn - ( Rn + Bn )/2; %tuned Green
B = Bn - ( Rn + Gn )/2; %tuned Blue
Y = ( Rn + Gn )/2 - abs( Rn - Gn )/2 - Bn; %Tuned Yellow

RG = R - G; %red-green opponent channel
BY = B - Y; %blue-yellow opponent channel

我在Matlab和Octave中都验证了代码,并且运行良好。但是,我仍然不知道如何在可以看到提取的颜色的图形或绘图中显示RG和BY通道。我想在输出中显示和看到的是这样的:

图h)和i)显示了红绿色和蓝黄色颜色对应度图


上一张图片摘自本文:CORTICAL MECHANISMS OF COLOUR VISION

我的情节看起来像这样:

我的对手频道RG和BY的情节

如果有人知道如何以我尝试的方式显示它,我将非常感激。谢谢!

1 个答案:

答案 0 :(得分:1)

我不确定我对下面的解释有100%的把握,所以一定要加一点盐。

我的理解是,您应该使用获得的R,G,B,Y通道定义3D坐标系,以使第一维沿黑白色轴区分,第二维沿红绿色轴区分。轴,第三个沿蓝黄色轴。我没有读过您上面引用的4篇论文,但是我假设您对RGBY的推导是正确的。

在下面的代码中,我假设黑白尺寸为R + G,这是我从您发布的说明性图片中了解到的,但是即使我错了,也可能会用其他任何方式替换它表示“亮度”的灰度图像(例如,使用rgb2gray)。

然后,其他两个维由代码中的RG和BY指定。我的理解是,在RG轴上,较低的值对应于“红色”,而较高的值对应于“绿色”。同样,在BY轴上,我的理解是,较低的值对应于“蓝色”,而较高的值对应于“黄色”。

因此,人们可以将RG层可视化为正常的真彩色(即rgb)图像,其中红色,绿色和蓝色通道分别设置为RG,1-RG和0(对于在0和1),这样当真彩色图像中红色通道增加时,绿色通道减少,反之亦然。

类似地,由于“黄色”由真彩色图像中的红色和绿色值相等,因此人们可以将BY层可视化为rgb图像1-BY,1-BY,BY(再次适当地归一化BY) ,则像素分配的“蓝色”越多,其“黄色”越少,反之亦然。

在这里,尽管在大脑中发生的确切标准化不太可能是相同的,但我在整个代码中随意地和随意地进行了标准化。但这对于可视化目的已经足够好了,我不能简单地使用未标准化的值,否则我们将尝试绘制可以进入负范围的值。因此,尽管我们不能就绝对强度来比较不同的层,但可视化效果足以让您了解层在何处显示其表示的尺寸的较高或较低的值,从而可以对原始图像。

代码如下:

  clear all; clc;
  pkg load image;

% Get image and RGB channels
  rgbNormImage = im2double(imread('sample.png'));
  Rn = rgbNormImage(:, :, 1); %red   normalized channel
  Gn = rgbNormImage(:, :, 2); %green normalized channel
  Bn = rgbNormImage(:, :, 3); %blue  normalized channel

% Define Red, Green, Blue, and Yellow 'heatmaps'
  Hot_red    = hot(256);
  Hot_green  = hot(256)( :, [3, 1, 2] );
  Hot_blue   = hot(256)( :, [3, 2, 1] );
  Hot_yellow = hot(256)( :, [1, 1, 2] ); 

% Plot Original RGB Channels in their respective 'heatmap'
  figure(1, 'name', 'Original (normalized) RGB channels');
  axes( 'position', [ 0.26, 0.51, 0.48, 0.48 ] ); imagesc( rgbNormImage )            ; axis image off;
  axes( 'position', [ 0.01, 0.01, 0.31, 0.48 ] ); subimage( im2uint8(Rn), Hot_red )  ; axis image off;
  axes( 'position', [ 0.34, 0.01, 0.31, 0.48 ] ); subimage( im2uint8(Gn), Hot_green ); axis image off;
  axes( 'position', [ 0.67, 0.01, 0.31, 0.48 ] ); subimage( im2uint8(Bn), Hot_blue ) ; axis image off;

% Transform from RGB to RGBY
  R = Rn - ( Gn + Bn ) / 2;          %tuned Red
  G = Gn - ( Rn + Bn ) / 2;          %tuned Green
  B = Bn - ( Rn + Gn ) / 2;          %tuned Blue
  Y = (Rn+Gn)/2 - abs(Rn-Gn)/2 - Bn; %Tuned Yellow

% Plot 'tuned' RGBY channels in their respective 'heatmap'
  figure(2, 'name', 'Tuned RGBY channels');
  axes( 'position', [ 0.01, 0.51, 0.48, 0.48 ] ); subimage( im2uint8(mat2gray(R)), Hot_red    ); axis image off;
  axes( 'position', [ 0.51, 0.51, 0.48, 0.48 ] ); subimage( im2uint8(mat2gray(G)), Hot_green  ); axis image off;
  axes( 'position', [ 0.01, 0.01, 0.48, 0.48 ] ); subimage( im2uint8(mat2gray(B)), Hot_blue   ); axis image off;
  axes( 'position', [ 0.51, 0.01, 0.48, 0.48 ] ); subimage( im2uint8(mat2gray(Y)), Hot_yellow ); axis image off;

% Transform RGBY to Black-White, Red-Green, Blue-Yellow channels
  BW = R + G; % black-white opponent channel
  RG = R - G; % red-green   opponent channel
  BY = B - Y; % blue-yellow opponent channel

% Normalise and convert to RGB images for visualisation purposes
  BW = mat2gray( BW );
  RG = mat2gray( RG );
  BY = mat2gray( BY );

  Z = zeros( size( BW ) );
  BW_asRGB = cat( 3, BW    , BW    , BW );
  RG_asRGB = cat( 3, RG    , 1 - RG, Z  );
  BY_asRGB = cat( 3, 1 - BY, 1 - BY, BY );

% Plot BW, RG, BY channels
  figure(3, 'name', 'Black-White, Red-Green, and Blue-Yellow channels')
  axes( 'position', [ 0.26, 0.51, 0.48, 0.48 ] ); imagesc( rgbNormImage ); axis image off;
  axes( 'position', [ 0.01, 0.01, 0.31, 0.48 ] ); imagesc( mat2gray(BW_asRGB)  ); axis image off
  axes( 'position', [ 0.34, 0.01, 0.31, 0.48 ] ); imagesc( mat2gray(RG_asRGB) ); axis image off
  axes( 'position', [ 0.67, 0.01, 0.31, 0.48 ] ); imagesc( mat2gray(BY_asRGB) ); axis image off


这是生成的图像。
(注意:图1和图2中的热图都将较低的值显示为较暗的像素,将较高的值显示为较亮的像素,但使用的颜色在其他方面无关紧要。它仅用于更好的颜色编码,但它们可能还有灰度图像)。


图1-原始图像和相应的RGB通道(分别使用红色,绿色和蓝色热图着色)


图2-'Tuned'RGBY通道(分别使用红色,绿色,蓝色和黄色热图着色)


黑白,红绿色和蓝黄色图层


从视觉上看,输出似乎很有意义。 :)

例如,如果我们关注图板,它是深绿色的蓝色,在图1中的正常RGB情况下,您会看到红色通道的值非常低,而绿色通道的亮度更高,然后蓝色比绿色甚至更多,也就是说,与其他两个相比,蓝色的贡献最大(但请注意,绿色和蓝色都不会 自身变亮,因为盘子是'总的来说强度很高。

在图2中,您可以类似地看到红色和黄色通道对板块的贡献不大(蓝色似乎比绿色块贡献了 lot 更多,这再次是我们可能会期望...但是请记住,这种较大的差异也可能是由于应用了归一化导致的,因此在此处进行层之间的直接比较可能不太合适)

最后,图3是我们感兴趣的三个维度。第一维向我们显示该板在黑白维中具有较低的值(即,其具有较低的亮度)。红绿色的尺寸向我们显示该板在该尺寸上比“红色”更“绿色”。最后,蓝黄色的尺寸向我们展示了印版比“黄色”更“蓝色”。