matlab - paleta - ¿Cómo puedo convertir un nombre de color en un vector RGB de 3 elementos?
plot matlab (3)
En muchas funciones de trazado de MATLAB, puede especificar el color como una cadena o como un vector de 3 elementos que enumera directamente los valores rojo, verde y azul.
Por ejemplo, estas dos declaraciones son equivalentes:
plot(x, y, ''Color'', ''r'');
plot(x, y, ''Color'', [1 0 0]);
Hay 8 colores que se pueden especificar con un valor de cadena: ''r'',''g'',''b'',''c'',''m'',''y'',''k'',''w''
. ¿Hay una función incorporada de MATLAB que convierta estas cadenas a un vector RGB equivalente?
Encontré esta alternativa general en MathWorks File Exchange que incluso manejará cadenas de colores diferentes al 8 predeterminado en MATLAB:
Si solo le interesan las conversiones para las cadenas de 8 colores predeterminadas, aquí hay una función que escribí yo misma que utilizo para convertir las tripletas RGB y los nombres de colores cortos (es decir, caracteres únicos) de ida y vuelta:
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
Tenga en cuenta que esta función le permite ingresar una cadena de caracteres o una matriz numérica o lógica N-by-3 (con valores RGB de 0 a 1 o de 0 a 255) y devuelve la representación de color opuesta. También usa la función ISMEMBER para hacer las conversiones.
No creo que haya una función para esto en Matlab. Sugiero que use la función Marcs, o este one-liner.
C = rem(floor((strfind(''kbgcrmyw'', C) - 1) * [0.25 0.5 1]), 2);
En caso de que no lo haya hecho, acabo de hackear uno
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