Отображение красно-зеленых и сине-желтых цветовых каналов противника с изображения - PullRequest
1 голос
/ 02 мая 2020

Я делаю код обработки изображения для разделения цветов оппонента Красно-зеленый и Сине-желтый из изображения на основе каналов R, G и B. Я делаю это в программном обеспечении Octave. На самом деле я основываюсь на следующих статьях, связанных с визуальным моделированием внимания: Itti1998 , GaoVasconcelos2007 , Heinen2009 . Этот код объясняет, как я извлекаю каналы:

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 на рисунке или графике, где я могу увидеть извлеченные цвета. То, что я хочу отобразить и увидеть в выводе, выглядит примерно так:

image Рисунки h) и i) показывают карты оппонентов красно-зеленого и сине-желтого цвета


Предыдущее изображение было взято из этой статьи: КОРТИЧЕСКИЕ МЕХАНИЗМЫ ЦВЕТНОГО ВИДЕНИЯ

Мой сюжет выглядит так:

image Мой сюжет о каналах оппонента RG и BY

Я очень ценю, если кто-то знает, как отобразить это так, как я пытаюсь это сделать. Спасибо!

1 Ответ

1 голос
/ 03 мая 2020

Я не на 100% уверен в своей интерпретации ниже, поэтому возьмите ее с крошкой соли.

Насколько я понимаю, вы должны использовать полученные каналы R, G, B, Y чтобы определить трехмерную систему координат, такую, что первое измерение дифференцируется вдоль черно-белой оси, второе дифференцируется вдоль красно-зеленой оси, а третье вдоль сине-желтой оси. Я не читал 4 статьи, которые вы цитировали выше, но я предполагаю, что ваш вывод RGBY правильный.

В приведенном ниже коде я предположил, что черно-белое измерение R + G, что это то, что я понял из пояснительного изображения, которое вы разместили, но даже если я ошибся, его, вероятно, можно заменить любым другим изображением в градациях серого, представляющим «яркость» (например, с использованием rgb2gray).

Затем другие два измерения указываются RG и BY в вашем коде. Насколько я понимаю, на оси RG более низкие значения соответствуют «красным», а более высокие значения соответствуют «зеленым». Точно так же, по оси BY мое понимание состоит в том, что более низкие значения соответствуют «синим цветам», а более высокие значения соответствуют «желтым цветам».

Следовательно, можно визуализировать слой RG как нормальный истинный цвет (т.е. rgb) изображение, где красный, зеленый и синий каналы установлены на RG, ​​1-RG и 0 соответственно (для RG, который нормализован между 0 и 1), так что, когда красный канал увеличивается в изображении истинного цвета, зеленый канал уменьшается, и наоборот.

Аналогично, поскольку «желтый» состоит из равных значений красного и зеленого в изображении в истинном цвете, можно визуализировать слой BY как изображение rgb 1-BY, 1 -BY, BY (опять-таки для соответственно нормализованного BY), так что чем больше «синего» пикселя назначено, тем меньше «желтого» он имеет, и наоборот.

Здесь я нормализую произвольно и свободно по всему код, хотя точная нормализация, которая происходит в мозге, вряд ли будет такой же. Но это достаточно хорошо для целей визуализации, и я не мог просто использовать ненормализованные значения, иначе мы бы попытались построить значения, которые могут go в отрицательных диапазонах. Таким образом, хотя мы не можем сравнивать различные слои с точки зрения абсолютных интенсивностей, визуализация достаточно хороша, чтобы получить представление о том, где слой показывает более высокие или более низкие значения для измерения, которое он представляет, что позволяет провести сравнение по отношению к исходное изображение.

Вот код:

  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 показывают более низкие значения как более темные пиксели и более высокие значения как более светлые пиксели, но используемые цвета в противном случае не имеют значения. Он используется только для более приятного цветового кодирования, но они могли бы быть точно так же серыми изображения).


image Рис. 1 - Исходное изображение и соответствующие каналы RGB (раскрашены с использованием красных, зеленых и синих тепловых карт соответственно)


image Рис. 2 - «настроенные» RGBY-каналы (раскрашены с использованием красных, зеленых, синих и желтых тепловых карт соответственно)


image черно-белый, красный -зеленые и сине-желтые слои


Выводы, кажется, имеют смысл визуально. :)

Например, если мы сфокусируемся на пластине, которая темно-зеленого цвета sh -синяя, в обычном случае RGB на рисунке 1 вы можете увидеть, что красный канал имеет очень низкие значения там, тогда как зеленый имеет немного больше яркости, а затем синий имеет даже больше, чем зеленый, то есть он имеет наибольший вклад по сравнению с двумя другими (но учтите, что ни зеленый, ни синий не являются , что яркими сами по себе, так как общая пластина не очень интенсивна в целом).

На рисунке 2 вы также можете увидеть, что красный и желтый каналы не вносят большой вклад в пластину (кажется, что синий цвет вносит много больше, чем зеленый здесь, что опять-таки это то, что мы могли бы ожидать ... но имейте в виду, что эта большая разница также может быть связана с применяемой нормализацией, поэтому прямое сравнение между слоями здесь может быть не очень уместным)

Наконец, рис. 3 представляет наши три измерения, представляющие интерес. Первое измерение показывает нам, что пластина имеет низкое значение в черно-белом измерении (то есть имеет более низкую яркость). Красно-зеленое измерение показывает нам, что пластина в этом измерении более «зеленая», чем «красная». И наконец, сине-желтое измерение показывает нам, что пластина более «голубая», чем «желтая».

...