声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3504|回复: 11

[图像处理] 图形涂色问题(悬赏)

[复制链接]
发表于 2011-1-22 23:42 | 显示全部楼层 |阅读模式
20体能
就是想让0.6-0.7之间一个颜色,0.7-0.8一个颜色,0.8-0.9一个颜色,0.9-1一个颜色。
但是colorbar上的颜色和图形上的颜色不匹配。0.6~0.7和0.7~0.8涂成一个颜色了????
问题可能是出现在caxis上,但是如果把cp 改成5种颜色,colorbar又不匹配。请指教一下,非常感谢。
****************
clc
clear
cf2=[0.8163    0.8425    0.8595    0.8581    0.7743    0.6571    0.8534    0.8522;...
    0.7918    0.8053    0.8033    0.7986    0.7934    0.7889    0.7724    0.7874;...
    0.7771    0.7909    0.7969    0.8502    0.8137    0.7955    0.6184    0.6209];
figure
nn=0.6;
[c,h]=contour(cf2,[nn:0.1:1]);
contourf(cf2,[nn:0.1:1]);
clabel(c);
caxis([nn,1]);
cp=jet(4);%colormap
colormap(cp);
h1=colorbar;
set(h1,'Ylim',[nn,1]);
set(h1,'YTick',nn:0.1:1);
set(h1,'YTickLabel',nn:0.1:1);
*******************************

1.bmp
回复
分享到:

使用道具 举报

发表于 2011-1-23 00:44 | 显示全部楼层
  1. clc
  2. clear

  3. cf2=[0.8163    0.8425    0.8595    0.8581    0.7743    0.6571    0.8534    0.8522;...
  4.     0.7918    0.8053    0.8033    0.7986    0.7934    0.7889    0.7724    0.7874;...
  5.     0.7771    0.7909    0.7969    0.8502    0.8137    0.7955    0.6184    0.6209];
  6. figure

  7. nn=0.6;
  8. [c,h]=contour(cf2,[nn:0.1:1]);
  9. contourf(cf2,[nn:0.1:1]);
  10. clabel(c);
  11. caxis([0,1]);
  12. cp=jet(10);%colormap
  13. colormap(cp);
  14. h1=colorbar;
  15. set(h1,'Ylim',[nn,1]);
  16. set(h1,'YTick',nn:0.1:1);
  17. set(h1,'YTickLabel',nn:0.1:1);
复制代码

评分

1

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2011-1-23 01:43 | 显示全部楼层
本帖最后由 re-us 于 2011-1-23 01:46 编辑

非常感谢,我之前也试验了一下,好像感觉colormap的颜色总是比需要的颜色要多,很迷惑呀?????
我的想法是这样的:

contour
只想要从0.6-0.7, 0.7-0.8, 0.8-0.9, 0.9-1
那我就需要四种颜色,所以即用colormap(jet(4))
让后我想把所有图的颜色都控制在0.6-1之间,所以用caxis([0.6,1]),但是这样的话总是少一种颜色.
能能具体说一下到底contourf,caxiscolorbar之间怎么控制?
比如我稍微改一下这个程序(把原来的数值乘以2),又出现1.3~1.5之间涂成一种颜色了?
clc
clear
cf2=[0.8163    0.8425    0.8595    0.8581    0.7743    0.6571    0.8534    0.8522;...
    0.7918    0.8053    0.8033    0.7986    0.7934    0.7889    0.7724    0.7874;...
    0.7771    0.7909    0.7969    0.8502    0.8137    0.7955    0.6184    0.6209];
cf2=cf2.*2;
figure
nn=1;
[c,h]=contour(cf2,[nn:0.1:2]);
contourf(cf2,[nn:0.1:2]);
clabel(c);
caxis([1,2]);
cp=jet(10);%colormap
colormap(cp);
h1=colorbar;
set(h1,'Ylim',[nn,2]);
set(h1,'YTick',nn:0.1:2);
set(h1,'YTickLabel',nn:0.1:2);


谢谢
回复

使用道具 举报

发表于 2011-1-23 13:30 | 显示全部楼层
本帖最后由 qibbxxt 于 2011-1-23 13:35 编辑

应该和Cdata的数据,与caxis的映射方式有关系
lz可以仔细看看这段话


  1. How Color Axis Scaling Works

  2. Surface, patch, and image graphics objects having indexed CData and CDataMapping set to scaled map CData values to colors in the figure colormap each time they render. CData values equal to or less than cmin map to the first color value in the colormap, and CData values equal to or greater than cmax map to the last color value in the colormap. The following linear transformation is performed on the intermediate values (referred to as C below) to map them to an entry in the colormap (whose length is m, and whose row index is referred to as index below).

  3. index = fix((C-cmin)/(cmax-cmin)*m)+1;
  4. %Clamp values outside the range [1 m]
  5. index(index<1) = 1;
  6. index(index>m) = m;
复制代码

也许和
  1. K>> get(h22,'Cdata')

  2. ans =

  3. [0.8000]
  4. [0.8000]
  5. [0.7000]
  6. [0.6184]
复制代码


有关
我自己改了一下,似乎变成4种颜色了


复制代码

  1. clc
  2. clear

  3. cf2=[0.8163 0.8425 0.8595 0.8581 0.7743 0.6571 0.8534 0.8522;...
  4. 0.7918 0.8053 0.8033 0.7986 0.7934 0.7889 0.7724 0.7874;...
  5. 0.7771 0.7909 0.7969 0.8502 0.8137 0.7955 0.6184 0.6209];
  6. figure

  7. nn=0.6;
  8. [c,h]=contour(cf2,[nn:0.1:1]);
  9. [c2,h2]=contourf(cf2,[nn:0.1:1]);
  10. h22=get(h2,'children');

  11. set(h22(1),'Cdata',0.65);
  12. set(h22(2),'Cdata',0.75);
  13. set(h22(3),'Cdata',0.85);
  14. set(h22(4),'Cdata',0.95);

  15. clabel(c);
  16. caxis([nn,1]);
  17. cp=jet(4);%colormap
  18. colormap(cp);
  19. h1=colorbar;
  20. set(h1,'Ylim',[nn,1]);
  21. set(h1,'YTick',nn:0.1:1);
  22. set(h1,'YTickLabel',nn:0.1:1);
复制代码

回复

使用道具 举报

 楼主| 发表于 2011-1-23 23:32 | 显示全部楼层
回复 4 # qibbxxt 的帖子

我试验了一下,貌似是不行的,虽然是4种颜色,contourf的颜色和colorbar的颜色不匹配

还是非常感谢

点评

我只是举例,说明问题,你需要变通一下,改动Cdata的数据,画出自己想要的颜色就可以了  发表于 2011-1-24 08:47
回复

使用道具 举报

 楼主| 发表于 2011-1-23 23:37 | 显示全部楼层
看来这个问题还是值得大家探讨一下的。现在我稍微总结一下,期待大家的指导。
目的:运用contourf画填色等值线图,然后用colorbar把颜色标出来,重点是colorbar的颜色不要连续的,如果选择缺省的话就是用jet(64),这样颜色看起来是连续的,因为颜色比需要的多很多。
cf2=[0.8163 0.8425 0.8595 0.8581 0.7743 0.6571 0.8534 0.8522;
     0.7918 0.8053 0.8033 0.7986 0.7934 0.7889 0.7724 0.7874;
   0.7771 0.7909 0.7969 0.8502 0.8137 0.7955 0.6184 0.6209];

这个组数据介于0.6~1之间,目的是0.6-0.7之间一种颜色,0.7-0.8一种颜色,0.8-0.9一种颜色,0.9-1一种颜色。
messenger 给出了一个例子,解决了这个问题。但是如果把原来的数据乘以2(cf2.*2)把原来的程序适当改动,出现了1.3~1.5之间涂成一种颜色。下面是具体的程序,(1)是对的,(2)就是数据乘以2后,改动的程序,1.3~1.5涂成一种颜色了。

  1. %(1)
  2. clc
  3. clear

  4. cf2=[0.8163 0.8425 0.8595 0.8581 0.7743 0.6571 0.8534 0.8522;...
  5. 0.7918 0.8053 0.8033 0.7986 0.7934 0.7889 0.7724 0.7874;...
  6. 0.7771 0.7909 0.7969 0.8502 0.8137 0.7955 0.6184 0.6209];
  7. figure
  8. nn=0.6;
  9. [c,h]=contour(cf2,[nn:0.1:1]);
  10. [c1,h1]=contourf(cf2,[nn:0.1:1]);
  11. clabel(c);
  12. caxis([0,1]);
  13. cp=jet(10);%colormap
  14. colormap(cp);

  15. h2=colorbar;
  16. set(h2,'Ylim',[nn,1]);
  17. set(h2,'YTick',nn:0.1:1);
  18. set(h2,'YTickLabel',nn:0.1:1);
复制代码

  1. %(2)注意1.3-1.5之间的颜色是一样的
  2. clc
  3. clear
  4. cf2=[0.8163 0.8425 0.8595 0.8581 0.7743 0.6571 0.8534 0.8522;...
  5. 0.7918 0.8053 0.8033 0.7986 0.7934 0.7889 0.7724 0.7874;...
  6. 0.7771 0.7909 0.7969 0.8502 0.8137 0.7955 0.6184 0.6209];
  7. cf2=cf2.*2;

  8. figure
  9. nn=1.2;
  10. [c,h]=contour(cf2,[nn:0.1:2]);
  11. [c1,h1]=contourf(cf2,[nn:0.1:2]);
  12. clabel(c);
  13. caxis([1,2]);
  14. cp=jet(10);%colormap
  15. colormap(cp);

  16. h2=colorbar;
  17. set(h2,'Ylim',[nn,2]);
  18. set(h2,'YTick',nn:0.1:2);
  19. set(h2,'YTickLabel',nn:0.1:2);
复制代码
回复

使用道具 举报

 楼主| 发表于 2011-1-24 11:41 | 显示全部楼层
回复 5 # re-us 的帖子

恩,那我再研究一下,非常感谢
回复

使用道具 举报

发表于 2011-1-24 16:58 | 显示全部楼层
很有意思的问题下午抽了点时间跑了一下程序。其实如果了解
  1. [c,h]=contour(...)
复制代码
的流程,尤其是c这个数据的结构,这个问题并不难:
症结在于你对数据本身的干预太多,不妨注释掉contour那一行代码,将contourf部分露出来:
[c,h]=contourf(...)
以第一组数据为例:最大值在0.8左右,而你却用1作为caxis和上限,而打开c数据:
  1. c =
  2.   Columns 1 through 13
  3.     0.6184       NaN    0.7000    6.5392    7.0000    8.0000       NaN    6.2185    6.0000    5.6340    0.8000    1.0000    1.6074
  4.     1.0000       NaN    7.0000    3.0000    2.4701    2.5249       NaN    1.0000    1.3255    1.0000   12.0000    1.6653    2.0000
  5.   Columns 14 through 26
  6.     2.0000    3.0000    3.0582       NaN    5.7527    5.0000    4.0000    3.7021    4.0000    4.6933    0.8000    6.7280    7.0000
  7.     2.3681    2.5156    3.0000       NaN    3.0000    2.3251    2.0271    2.0000    1.9765    1.0000    3.0000    1.0000    1.6593
  8.   Column 27
  9.     8.0000
  10.     1.8056
复制代码
对照会发现其第一行的数据level中只有0.7和0.8两个数值,所以此时colorbar中的色值索引出现问题:看着是1 的那个对应值,其实是0.8,看着是0.8的对应值,其实0.7,此时的四个颜色对应在0.7~0.8上下进行分色。如果不信,可以把caxis那一行注释掉,让它自然分色,你会看到真正的索引映射:0.8~1之间都是白色的,根本没有用,但最后你却硬要去在.8:.1:1之间设置tick,就出现你被你自己的代码给骗了情况,所以你才会疑惑颜色的数量总和实际需要不同。
问题找到了,改就比较容易,你不妨自己先试试看。
回复

使用道具 举报

发表于 2011-1-24 17:02 | 显示全部楼层
本帖最后由 bainhome 于 2011-1-24 18:07 编辑

简而言之,就是c数据的level不受你的自行控制(也许不对,大家也可以试试去调整contourf的属性),所以你后续关于颜色的代码估计要去适应这个level分级,如何自适应调整,我估计要先归一化。
参考的修改代码:
  1. clc
  2. clear
  3. close all;
  4. cf2=[0.8163    0.8425    0.8595    0.8581    0.7743    0.6571    0.8534    0.8522;...
  5.     0.7918    0.8053    0.8033    0.7986    0.7934    0.7889    0.7724    0.7874;...
  6.     0.7771    0.7909    0.7969    0.8502    0.8137    0.7955    0.6184    0.6209];
  7. figure;
  8. IndC=cf2(:)/max(cf2(:));
  9. nn=0.6;
  10. % [c,h]=contour(cf2,nn:0.1:1);
  11. [c,h]=contourf(cf2,nn:.1:1);
  12. clabel(c);
  13. caxis([nn,.8]);
  14. cp=jet(4);%colormap
  15. cAxis=colormap(cp);
  16. h1=colorbar;
  17. set(h1,'Ylim',[nn,.8]);
  18. set(h1,'YTick',nn:0.05:.8);
  19. set(h1,'YTickLabel',nn:0.05:.8);
复制代码
ps:以后有问题其实不需要悬赏,这会让很多想参与的同仁产生一种抗拒感,这次因为msn和qibbxxt两位大侠都来了,实在好奇,才进来凑个热闹,呵呵。


点评

赞成: 5.0
赞成: 5
不需要悬赏  发表于 2011-1-24 22:47

评分

1

查看全部评分

回复

使用道具 举报

发表于 2011-1-24 21:48 | 显示全部楼层
从抽象的角度说,这是一个决定与被决定的关系
图形是有数据来决定的,而不对数据或者数据的分类方式加以改变
仅仅靠改变外在的东西,是很难凑效的
回复

使用道具 举报

发表于 2011-1-24 22:05 | 显示全部楼层
今天试了几组简单的c数据,实在没耐心了,说实话,看不出规律来。这个c数据的结构是:
  1. level(1),...,level(2),...,level(i),...
  2. numel(1),...,numel(2),...,numel(i),...
复制代码
以第一组数据为例,level是指等值线数值,加上cf2的最小值,另外只有0.7和0.8两个,因此等值线数值的量小于自己规定的颜色数4。numel是指连成一个patch的点的数量,它后面带着的那一堆省略号就是这些点的坐标值,例如numel等于3,那么后面跟着三对坐标,接着又是一组level和numel,这组数据似乎并不是很好调整。所以楼主的认识的误区就在于:他认为
  1. nn:.1:1
复制代码
已经控制contourf按照这个数据去画等值线,其实根本没有,MATLAB画出来的就只有两个等值线:0.7和0.8的。第二组数据规律类似。
ps:qibbxxt的意思表达,我想了好久才转过弯儿来,呵呵。
这个c的控制其实很有意思,楼主没事可以研究研究,我是实在没心搞这个,天天陪母后置办年货了。

点评

赞成: 5.0
赞成: 5
恩,看了下,这个contourf的原函数似乎可见,但是太长了,逻辑关系有点麻烦,没有细看,lz也许可以override这个函数,达到自己的效果  发表于 2011-1-25 13:51
近来公私事都忙, 还没空试试学习  发表于 2011-1-24 22:51
回复

使用道具 举报

 楼主| 发表于 2011-2-12 04:46 | 显示全部楼层
研究中,谢谢大家
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-29 12:18 , Processed in 0.061065 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表