Я не на 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 показывают более низкие значения как более темные пиксели и более высокие значения как более светлые пиксели, но используемые цвета в противном случае не имеют значения. Он используется только для более приятного цветового кодирования, но они могли бы быть точно так же серыми изображения).
Рис. 1 - Исходное изображение и соответствующие каналы RGB (раскрашены с использованием красных, зеленых и синих тепловых карт соответственно)
Рис. 2 - «настроенные» RGBY-каналы (раскрашены с использованием красных, зеленых, синих и желтых тепловых карт соответственно)
черно-белый, красный -зеленые и сине-желтые слои
Выводы, кажется, имеют смысл визуально. :)
Например, если мы сфокусируемся на пластине, которая темно-зеленого цвета sh -синяя, в обычном случае RGB на рисунке 1 вы можете увидеть, что красный канал имеет очень низкие значения там, тогда как зеленый имеет немного больше яркости, а затем синий имеет даже больше, чем зеленый, то есть он имеет наибольший вклад по сравнению с двумя другими (но учтите, что ни зеленый, ни синий не являются , что яркими сами по себе, так как общая пластина не очень интенсивна в целом).
На рисунке 2 вы также можете увидеть, что красный и желтый каналы не вносят большой вклад в пластину (кажется, что синий цвет вносит много больше, чем зеленый здесь, что опять-таки это то, что мы могли бы ожидать ... но имейте в виду, что эта большая разница также может быть связана с применяемой нормализацией, поэтому прямое сравнение между слоями здесь может быть не очень уместным)
Наконец, рис. 3 представляет наши три измерения, представляющие интерес. Первое измерение показывает нам, что пластина имеет низкое значение в черно-белом измерении (то есть имеет более низкую яркость). Красно-зеленое измерение показывает нам, что пластина в этом измерении более «зеленая», чем «красная». И наконец, сине-желтое измерение показывает нам, что пластина более «голубая», чем «желтая».