在不修改数据的情况下创建非线性MATLAB色彩图

时间:2013-02-19 00:44:48

标签: matlab

我在创建自定义MATLAB色彩映射和色条时遇到了一些麻烦。我想显示一个图像(例如imagesc),我想通过Nx4矩阵定义一个颜色图

cMap = [ x(1) r(1) g(1) b(1); ...
         x(2) r(2) g(2) b(2); ...
         ...
         x(N) r(N) g(N) b(N)]; 

使x(i)x(i+1)之间的图片值具有颜色r(i),g(i),b(i)。向量x需要增加,但不一定是线性方式。此外,我希望能够使用GUI单击图像并查看每个像素的实际图像值,因此我不想在显示之前重新分配像素值。最后,我想要一个颜色条,每个颜色由一段相等长度的段表示。

我能够通过找到diff(x)的最小公倍数,并将几个恒定颜色的行连接到一个色彩图中来完成这些事情的2/3,但是这样做的颜色条的颜色大小与沿x的差异,看起来很糟糕,难以阅读。

为了解决彩条问题,我尝试在cMap中制作几个颜色的补丁对象,将它们放在[inf inf]然后在这些对象上调用legend,但设置使所有尺寸的色彩图看起来都很好所需的所有图例和轴属性非常难,而且我会在多个用户使用此工具时不断调试它。如果可以的话,我很乐意使用MATLAB colorbar。

有没有人曾经处理过这样的问题? 谢谢!

2 个答案:

答案 0 :(得分:1)

您将无法以您希望的方式非线性拉伸和压缩MATLAB色条。但是,您可以做的一件事是在颜色边界处设置刻度线。您可以像这样更改刻度线位置:

>> imagesc(peaks);
>> h = colorbar;
>> set(h, 'YTick', [-5 -1.5 0 1 3.5 6.2]);

另一种选择是将颜色条绘制为另一个图像,这实际上就是MATLAB颜色条的颜色。

答案 1 :(得分:0)

我在想,这样的事可能有用......

       xi=floor(x/max(x));
       cMap = [ r(xi(1)) g(xi(1)) b(xi(1)); ...
                r(xi(2)) g(xi(2)) b(xi(2)); ...
                ...
                r(xi(N)) g(xi(N)) b(xi(N))];