在许多MATLAB绘图功能中,您可以将颜色指定为字符串或直接列出红色,绿色和蓝色值的3元素矢量.
例如,这两个陈述是等价的:
plot(x, y, 'Color', 'r');
plot(x, y, 'Color', [1 0 0]);
Run Code Online (Sandbox Code Playgroud)
有8种颜色可以用字符串值指定:'r','g','b','c','m','y','k','w'.是否有MATLAB内置函数将这些字符串转换为等效的RGB矢量?
我在MathWorks文件交换中找到了这个通用的替代方法,它甚至可以处理MATLAB中默认值为8的颜色字符串:
如果您只关注默认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
Run Code Online (Sandbox Code Playgroud)
请注意,此功能允许您输入字符串或 N-by-3数字或逻辑数组(RGB值从0到1或0到255),并返回相反的颜色表示.它还使用ISMEMBER函数进行转换.
万一没有,我就一起黑了一个
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
Run Code Online (Sandbox Code Playgroud)
我认为在matlab中没有为此功能。我建议您使用Marcs函数或单行代码。
C = rem(floor((strfind('kbgcrmyw', C) - 1) * [0.25 0.5 1]), 2);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12254 次 |
| 最近记录: |