MATLAB | 有关数值矩阵颜色图及颜色列表的技巧整理
Posted slandarer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB | 有关数值矩阵颜色图及颜色列表的技巧整理相关的知识,希望对你有一定的参考价值。
这是一篇有关数值矩阵、颜色矩阵、颜色列表的技巧整合,会以随笔的形式想到哪写到哪,可能思绪会比较飘逸请大家见谅,本文大体分为以下几个部分:
- 数值矩阵用颜色显示
- 从颜色矩阵提取颜色
- 从颜色矩阵中提取数据
- 颜色列表相关函数
- 颜色测试图表的识别
数值矩阵用颜色显示
heatmap
我们最常用的肯定就是heatmap函数显示数值矩阵:
X=rand(10);
heatmap(X);
字体颜色可设置为透明:
X=rand(10);
HM=heatmap(X);
HM.CellLabelColor='none';
如果由NaN值,会显示为黑色:
X=rand(10);
X([3,4,15])=nan;
HM=heatmap(X);
HM.CellLabelColor='none';
这个颜色也可以改,比如改成浅灰色:
X=rand(10);
X([3,4,15])=nan;
HM=heatmap(X);
HM.CellLabelColor='none';
HM.MissingDataColor=[.8,.8,.8];
imagesc
imagesc随便加个colorbar就和heatmap非常像了,而且比较容易进行图像组合(heatmap的父类不能是axes),但是没有边缘:
X=rand(10);
imagesc(X)
colormap(winter)
colorbar
比较烦的是imagesc即使数据有NaN也会对其进行插值显示,好坏参半吧。
另外随便写了点代码发现MATLAB自带的幻方绘制挺有规律的hiahiahia:
for i=1:16
ax=subplot(4,4,i);
hold on;axis tight off equal
X=magic(3+i);
imagesc(X);
end
image
image函数单通道时也可以设置colormap来进行颜色映射:
load spine
image(X)
colormap(map)
pcolor
pcolor由于每个方块颜色都会使用左上角的数值来计算,因此会缺一行一列,我们可以补上一行一列nan:
X=rand(6);
X(end+1,:)=nan;
X(:,end+1)=nan;
pcolor(X);
colormap(winter)
colorbar
可修饰的东西就比较丰富了,比如边缘颜色:
X=rand(6);
X(end+1,:)=nan;
X(:,end+1)=nan;
pHdl=pcolor(X);
pHdl.EdgeColor=[1,1,1];
pHdl.LineWidth=2;
colormap(winter)
colorbar
气泡图
气泡图大概也能冒充一下热图:
Z=rand(7);
[X,Y]=meshgrid(1:size(Z,2),1:size(Z,1));
bubblechart(X(:),Y(:),Z(:),Z(:),'MarkerFaceAlpha',.6)
colormap(parula)
colorbar
set(gca,'XTick',1:size(Z,2),'YTick',1:size(Z,1),'LineWidth',1,...
'XGrid','on','YGrid','on','FontName','Cambria','FontSize',13)
随便写着玩
虽然surf函数调整视角也像是热图的样子,但是不打算讲了,反而等高线填充图虽然不像热图但是很有意思,感觉可以当作colormap展示的示例图:
X=rand(10);
CF=contourf(X);
colormap(winter)
colorbar
从颜色矩阵提取颜色
像素提取器
需要安装:
Image Processing Toolbox
图像处理工具箱.
使用以下代码可以显示每个像素RGB值:
imshow('peppers.png')
impixelregion
图片颜色统计小函数
我写过一个RGB颜色统计图绘制函数:
function HistogramPic(pic)
FreqNum=zeros(size(pic,3),256);
for i=1:size(pic,3)
for j=0:255
FreqNum(i,j+1)=sum(sum(pic(:,:,i)==j));
end
end
ax=gca;hold(ax,'on');box on;grid on
if size(FreqNum,1)==3
bar(0:255,FreqNum(1,:),'FaceColor',[0.6350 0.0780 0.1840],'FaceAlpha',0.5);
bar(0:255,FreqNum(2,:),'FaceColor',[0.2400 0.5300 0.0900],'FaceAlpha',0.5);
bar(0:255,FreqNum(3,:),'FaceColor',[0 0.4470 0.7410],'FaceAlpha',0.5);
ax.XLabel.String='RGB brightness';
rrange=[num2str(min(pic(:,:,1),[],[1,2])),' , ',num2str(max(pic(:,:,1),[],[1,2]))];
grange=[num2str(min(pic(:,:,2),[],[1,2])),' , ',num2str(max(pic(:,:,2),[],[1,2]))];
brange=[num2str(min(pic(:,:,3),[],[1,2])),' , ',num2str(max(pic(:,:,3),[],[1,2]))];
legend(['R: range[',rrange,']'],['G: range[',grange,']'],['B: range[',brange,']'],...
'Location','northwest','Color',[0.9412 0.9412 0.9412],...
'FontName','Cambria','LineWidth',0.8,'FontSize',11);
else
bar(0:255,FreqNum(1,:),'FaceColor',[0.50 0.50 0.50],'FaceAlpha',0.5);
ax.XLabel.String='Gray scale';
krange=[num2str(min(pic(:,:,1),[],[1,2])),' , ',num2str(max(pic(:,:,1),[],[1,2]))];
legend(['Gray: range[',krange,']'],...
'Location','northwest','Color',[0.9412 0.9412 0.9412],...
'FontName','Cambria','LineWidth',0.8,'FontSize',11);
end
ax.LineWidth=1;
ax.GridLineStyle='--';
ax.XLim=[-5 255];
ax.XTick=[0:45:255,255];
ax.YLabel.String='Frequency number';
ax.FontName='Cambria';
ax.FontSize=13;
end
非常简单的使用方法,就是读取图片后调用函数即可:
pic=imread('test.png');
HistogramPic(pic)
若图像为灰度图则效果如下:
色卡生成器
从图片中提取主要颜色:https://mp.weixin.qq.com/s/Pj6t0SMDBAjQi3ecj6KVaA
颜色提取器
推荐两款颜色提取器,一款免费一款付费:
免费版:https://mp.weixin.qq.com/s/uIyvqQa9Vnz7gYLgd7lUtg
付费版:https://mp.weixin.qq.com/s/BpegP7CpOQERwrUXHexsGQ
从颜色矩阵中提取数据
之前写过一列把热图变为数值矩阵的函数,可以去瞅一眼:https://mp.weixin.qq.com/s/wzqCCFF2yvC80-ruqMKOpQ
颜色列表相关函数
颜色方块展示函数
写了个用来显示颜色的小函数:
function colorSwatches(C,sz)
ax=gca;hold on;
ax.YDir='reverse';
ax.XColor='none';
ax.YColor='none';
ax.DataAspectRatio=[1,1,1];
for i=1:sz(1)
for j=1:sz(2)
if j+(i-1)*sz(2)<=size(C,1)
fill([-.4,-.4,.4,.4]+j,[-.4,.4,.4,-.4]+i,C(j+(i-1)*sz(2),:),...
'EdgeColor','none')
end
end
end
end
使用方式(第一个参数是颜色列表,第二个参数是显示行列数):
C=lines(7);
colorSwatches(C,[3,3])
C=[0.6471 0 0.1490
0.7778 0.1255 0.1516
0.8810 0.2680 0.1895
0.9569 0.4275 0.2627
0.9804 0.5974 0.3412
0.9935 0.7477 0.4418
0.9961 0.8784 0.5647
0.9987 0.9595 0.6876
0.9595 0.9843 0.8235
0.8784 0.9529 0.9725
0.7399 0.8850 0.9333
0.5987 0.7935 0.8824
0.4549 0.6784 0.8196
0.3320 0.5320 0.7438
0.2444 0.3765 0.6654
0.1922 0.2118 0.5843];
colorSwatches(C,[4,4])
插值
要是自己准备的颜色列表颜色数量少可能会不连续:
XData=rand(15,15);
XData=XData+XData.';
H=fspecial('average',3);
XData=imfilter(XData,H,'replicate');
imagesc(XData)
CM=[0.6196 0.0039 0.2588
0.8874 0.3221 0.2896
0.9871 0.6459 0.3636
0.9972 0.9132 0.6034
0.9300 0.9720 0.6398
0.6319 0.8515 0.6437
0.2835 0.6308 0.7008
0.3686 0.3098 0.6353];
colormap(CM)
colorbar
hold on
ax=gca;
ax.DataAspectRatio=[1,1,1];
可以对其进行插值:
rng(24)
XData=rand(15,15);
XData=XData+XData.';
H=fspecial('average',3);
XData=imfilter(XData,H,'replicate');
imagesc(XData)
CM=[0.6196 0.0039 0.2588
0.8874 0.3221 0.2896
0.9871 0.6459 0.3636
0.9972 0.9132 0.6034
0.9300 0.9720 0.6398
0.6319 0.8515 0.6437
0.2835 0.6308 0.7008
0.3686 0.3098 0.6353];
CMX=linspace(0,1,size(CM,1));
CMXX=linspace(0,1,256)';
CM=[interp1(CMX,CM(:,1),CMXX,'pchip'),interp1(CMX,CM(:,2),CMXX,'pchip'),interp1(CMX,CM(:,3),CMXX,'pchip')];
colormap(CM)
colorbar
hold on
ax=gca;
ax.DataAspectRatio=[1,1,1];
colormap编辑器
colormapeditor
编辑完可以另存工作区,之后存为mat文件:
save CM.mat CustomColormap
之后画图就可以用啦:
rgbImage=imread("peppers.png");
imagesc(rgb2gray(rgbImage))
load CM.mat
colormap(CustomColormap)
colormap显示
Steve Eddins大佬写了个美观的colormap展示器
Steve Eddins (2023). Colormap Test Image (https://www.mathworks.com/matlabcentral/fileexchange/63726-colormap-test-image), MATLAB Central File Exchange. 检索来源 2023/2/13.
function I = colormapTestImage(map)
% colormapTestImage Create or display colormap test image.
% I = colormapTestImage creates a grayscale image matrix that is useful
% for evaluating the effectiveness of colormaps for visualizing
% sequential data. In particular, the small-amplitude sinusoid pattern at
% the top of the image is useful for evaluating the perceptual uniformity
% of a colormap.
%
% colormapTestImage(map) displays the test image using the specified
% colormap. The colormap can be specified as the name of a colormap
% function (such as 'parula' or 'jet'), a function handle to a colormap
% function (such as @parula or @jet), or a P-by-3 colormap matrix.
%
% EXAMPLES
%
% Compute the colormap test image and save it to a file.
%
% mk = colormapTestImage;
% imwrite(mk,'test-image.png');
%
% Compare the perceptual characteristics of the parula and jet
% colormaps.
%
% colormapTestImage('parula')
% colormapTestImage('jet')
%
% NOTES
%
% The image is inspired by and adapted from the te以上是关于MATLAB | 有关数值矩阵颜色图及颜色列表的技巧整理的主要内容,如果未能解决你的问题,请参考以下文章
Python混淆矩阵可视化:plt.colorbar函数自定义颜色条的数值标签配置不同情况下颜色条的数值范围以及数据类型(整型浮点型)