Как я могу преобразовать имя цвета в вектор RGB с 3 элементами? - PullRequest
6 голосов
/ 07 февраля 2011

Во многих функциях построения графиков MATLAB вы можете указать цвет либо в виде строки, либо в виде 3-элементного вектора, который напрямую перечисляет значения красного, зеленого и синего.

Например, эти два оператора эквивалентны:

plot(x, y, 'Color', 'r');
plot(x, y, 'Color', [1 0 0]);

Существует 8 цветов, которые могут быть указаны строковым значением: 'r','g','b','c','m','y','k','w'.Существует ли встроенная функция MATLAB, которая преобразует эти строки в эквивалентный вектор RGB?

Ответы [ 4 ]

6 голосов
/ 07 февраля 2011

Я нашел эту общую альтернативу на MathWorks File Exchange , которая будет обрабатывать даже цветные строки, отличные от 8 по умолчанию в MATLAB:

Если вас интересует только преобразование для 8 цветовых строк по умолчанию, вот функция, которую я написал сам, которую я использую для преобразования назад и вперед между RGBтройные и короткие имена цветов (т. е. отдельные символы):

function outColor = convert_color(inColor)

  charValues = 'rgbcmywk'.';  %#'
  rgbValues = [eye(3); 1-eye(3); 1 1 1; 0 0 0];
  assert(~isempty(inColor),'convert_color:badInputSize',...
         'Input argument must not be empty.');

  if ischar(inColor)  %# Input is a character string

    [isColor,colorIndex] = ismember(inColor(:),charValues);
    assert(all(isColor),'convert_color:badInputContents',...
           'String input can only contain the characters ''rgbcmywk''.');
    outColor = rgbValues(colorIndex,:);

  elseif isnumeric(inColor) || islogical(inColor)  %# Input is a numeric or
                                                   %#   logical array
    assert(size(inColor,2) == 3,'convert_color:badInputSize',...
           'Numeric input must be an N-by-3 matrix');
    inColor = double(inColor);           %# Convert input to type double
    scaleIndex = max(inColor,[],2) > 1;  %# Find rows with values > 1
    inColor(scaleIndex,:) = inColor(scaleIndex,:)./255;  %# Scale by 255
    [isColor,colorIndex] = ismember(inColor,rgbValues,'rows');
    assert(all(isColor),'convert_color:badInputContents',...
           'RGB input must define one of the colors ''rgbcmywk''.');
    outColor = charValues(colorIndex(:));

  else  %# Input is an invalid type

    error('convert_color:badInputType',...
          'Input must be a character or numeric array.');

  end

Обратите внимание, что эта функция позволяет вводить либо строку символов , либо числовой или логический массив N-by-3(со значениями RGB от 0 до 1 или от 0 до 255) и возвращает представление противоположного цвета.Он также использует функцию ISMEMBER для выполнения преобразований.

4 голосов
/ 07 февраля 2011

Я не думаю, что есть функция для этого в Matlab.Я предлагаю вам использовать функцию Marcs, или эту однострочную.

C = rem(floor((strfind('kbgcrmyw', C) - 1) * [0.25 0.5 1]), 2); 
2 голосов
/ 07 февраля 2011

Если нет, я просто взломал один вместе

function rgbvec = char2rgb (charcolor)
%function rgbvec = char2rgb (charcolor)
%
%converts a character color (one of 'r','g','b','c','m','y','k','w') to a 3
%value RGB vector
%if charcolor is a string (vector of chars), the result is a Nx3 matrix of
%color values, where N is the length of charcolor

if (~exist(charcolor,'var') || ~ischar(charcolor))
    warning('RGB2VEC:NOTC', 'You must pass a character (rgbcmykw)');
    rgbvec = [0 0 0];
    return;
end
rgbvec = zeros(length(charcolor), 3);
charwarning = false;
for j = 1:length(charcolor)
    switch(lower(charcolor(j)))
        case 'r'
            rgbvec(j,:) = [1 0 0];
        case 'g'
            rgbvec(j,:) = [0 1 0];
        case 'b'
            rgbvec(j,:) = [0 0 1];
        case 'c'
            rgbvec(j,:) = [0 1 1];
        case 'm'
            rgbvec(j,:) = [1 0 1];
        case 'y'
            rgbvec(j,:) = [1 1 0];
        case 'w'
            rgbvec(j,:) = [1 1 1];
        case 'k'
            rgbvec(j,:) = [0 0 0];
        otherwise
            charwarning = true;
    end
end

if (charwarning)
    warning('RGB2VEC:BADC', 'Only r,g,b,c,m,y,k,and w are recognized colors');
end
0 голосов
/ 08 марта 2019

вот тот самый лайнер, который вам не нужно искать для C:

str2rgb=@(x)get(line('color',x),'color');

Теперь str2rgb даст вам ответнапример str2rgb('c') = [0 1 1].

...