Marc
Marc

Reputation: 5595

How can I convert a color name to a 3 element RGB vector?

In many MATLAB plotting functions, you can specify the color as either a string or as a 3 element vector that directly lists the red, green, and blue values.

For instance, these two statements are equivalent:

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

There are 8 colors that can be specified by a string value: 'r','g','b','c','m','y','k','w'. Is there a MATLAB built-in function that converts these strings to an equivalent RGB vector?

Upvotes: 8

Views: 15506

Answers (6)

John Bofarull Guix
John Bofarull Guix

Reputation: 805

There's no MATLAB built-in function to convert 'r','g','b','c','m','y','k','w' to the respective RGB colours because all these cases are well known to be BASIC colours.

Every one blending BASIC colours should know each and all of them, at all times.

In any case it may be useful to build a table or define constants using the following values:

1.- Primary additive colours

red green blue

r [255 0 0]
g [0 255 0]
b [0 0 255]

2.- Primary subtractive colours

cyan magenta yellow

c [0 255 255]
m [255 0 255]
y [255 255 0]

3.- black : absence of any colour

k [0 0 0]

4.- white : all colours

w [255 255 255]

Note that in MATLAB the command plot requires field 'Color' input with range [0 1].

so whatever values [0 255] used divide them by 255 to plot custom colours.

Upvotes: 0

Balam Willemsen
Balam Willemsen

Reputation: 46

Since R2020b you can use validatecolor for this.

Upvotes: 3

user847314
user847314

Reputation: 31

here's a oneliner you don't have to solve for C:

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

Now str2rgb gives you the answer. for example str2rgb('c') = [0 1 1].

Upvotes: 3

Marc
Marc

Reputation: 5595

In case there isn't, I just hacked one together

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

Upvotes: 5

gnovice
gnovice

Reputation: 125854

I found this general alternative on the MathWorks File Exchange which will even handle color strings other than the default 8 in MATLAB:

If you're only concerned with conversions for the default 8 color strings, here's a function I wrote myself that I use to convert back and forth between RGB triples and short color names (i.e. single characters):

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

Note that this function allows you to input either a string of characters or an N-by-3 numeric or logical array (with RGB values from 0 to 1 or 0 to 255) and it returns the opposite color representation. It also uses the function ISMEMBER to do the conversions.

Upvotes: 8

Ghaul
Ghaul

Reputation: 3330

I don't think there is a function for this in matlab. I suggest you use Marcs function, or this one-liner.

C = rem(floor((strfind('kbgcrmyw', C) - 1) * [0.25 0.5 1]), 2); 

Upvotes: 6

Related Questions