Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 显示图像中的红绿色和蓝黄色对手颜色通道_Image Processing_Plot_Colors_Octave - Fatal编程技术网

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

Image processing 显示图像中的红绿色和蓝黄色对手颜色通道,image-processing,plot,colors,octave,Image Processing,Plot,Colors,Octave,我正在做一个图像处理代码,从基于R、G和B通道的图像中分割对手的颜色红-绿和蓝-黄。我用倍频程软件来做这个。实际上,我是基于以下与视觉注意力建模相关的文章:,。此代码解释了如何提取通道: clc rgbNormImage = im2double(imread('sample.jpg')); Rn = rgbNormImage(:, :, 1); %red normalized channel Gn = rgbNormImage(:, :, 2); %green normalized channe

我正在做一个图像处理代码,从基于R、G和B通道的图像中分割对手的颜色红-绿蓝-黄。我用倍频程软件来做这个。实际上,我是基于以下与视觉注意力建模相关的文章:,。此代码解释了如何提取通道:

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)显示了红绿和蓝黄颜色对映图


前一张图片取自本文:

我的情节是这样的:

我的对手的阴谋


如果有人知道如何以我尝试的方式展示这一点,我会非常感激。谢谢

我对下面的解释不是百分之百肯定,所以请不要小题大做

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

在下面的代码中,我假设黑白尺寸为R+G,这是我从您发布的解释性图像中理解的,但即使我弄错了,它也可能被表示“亮度”的任何其他灰度图像所取代(例如,使用
rgb2gray

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

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

类似地,由于“黄色”在真彩色图像中由相等的红色和绿色值组成,因此可以将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-“调谐”RGBY通道(分别使用红色、绿色、蓝色和耶洛热图着色)


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


输出在视觉上似乎有意义。:)

例如,如果我们聚焦在图1中正常RGB情况下的深绿色蓝色平板上,您可以看到红色通道的值非常低,而绿色的亮度稍高,然后蓝色的亮度甚至比绿色的高,即与其他两个相比,它的贡献最大(但请注意,无论是绿色还是蓝色本身都没有那么明亮,因为这个板块的整体强度不是很高)

在图2中,你同样可以看到红色和黄色通道对板块的贡献不大,(这里蓝色似乎比绿色贡献更多,这也是我们可能期望的……但请记住,这一巨大差异也可能是由于应用了标准化,因此直接比较各层可能不太合适)


最后,图3是我们感兴趣的三个维度。第一个维度向我们展示了平板在黑白维度中的低值(即,它的亮度较低)。红-绿维度向我们展示了该维度中的“绿色”比“红色”更为“绿色”。最后,蓝-黄维度向我们展示了该维度中的“蓝色”比“黄色”更为“蓝色”。

谢谢您的建议,这是我的第一个问题:)事实上,我看得越多,我就越确信R+G可能是亮度图像的错误计算…否则我会认为杯子会更亮一点…哦,好吧!非常感谢!事实上我记得我在其他有关颜色视觉理论的论文中看到过你提到的3D坐标系,你呢r结果与我期望的结果相符。非常感谢你抽出时间来解决我的问题!我非常感谢你。附加信息:我在再次阅读我在这里引用的论文,作者仅使用此坐标系计算对手c