作者y1027330 (leon)
看板MATLAB
标题[绘图] uint8转化 画图的问题
时间Mon Apr 16 21:31:48 2012
读取图片档(tif) 假设图片档是叫a
A=imread(a.tif)
所以举阵A 里面都是uint8的格式 (都是整数)
但我需要运算 比如 B=(36*A)/23 之类的
总之就是做加减乘除 会出现小数
因为我想保留这些小数 (因为需要这小数去分析 才会比较明显)
为了要保留小数 所以加了double这个指令
不然uint8的格式 怎麽加减乘除都还只保留整数
所以我在运算的时候 变成这样 B=36*double(A)/23
问题来了 加了double 却出现的这个错误
??? Error using ==> image
Error using ==> image
TrueColor CData contains element out of range 0.0 <= value <=
1.0
Error in ==> imagesc at 19
hh = image(varargin{1},'CDataMapping','scaled');
Error in ==> Untitled_Tb at 45
imagesc(B);
拜托 高手帮忙解决
以2000p当小小的回馈了
-------------------
这是我大体的程式
B=imread(A);
rad61 = (Lmax61-Lmin61)./(Qcalmax61-Qcalmin61).*((
B)-Qcalmin61)+Lmin61;
|加double的地方
(Lmax61 Lmin61 Qcalmax61 Qcalmin61) 这些都是常数
idx = find(real(rad61) <= 0.);
rad61(idx) = NaN;
T61=K2./(log((double(K1./rad61))+1))-273.16;
T61(T61<=-5)=NaN;
T61(T61>35)=NaN;
figure(1);
imagesc(T61);
因为我画是跟地区温度有关的图 所以会需要到0~35左右
然後真的用手去验算 值也差不多是0~35
所以感觉是画图的指令 imagesc(T61); 错误
想请问 还有其他画图推荐的指令
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.184.86
1F:→ abc01251:你确定错在那行吗 我打 没问题 可以过 04/16 21:49
2F:→ abc01251:imagesc(uint8(B)); << 这边吧~ 04/16 21:52
3F:→ doom8199:因为 imagesc 函式要求值要介於 0~1 04/16 21:52
4F:推 vincent59:我也觉得没问题??? 04/16 21:52
5F:→ doom8199:若你是读取 rgb 图片,要先除以 255.0 04/16 21:53
6F:→ vincent59:所以原po问的是秀图的部分?? 04/16 21:53
恩恩 很像真的是後面我画imagesc(B) 需要在0~1之间
但我的图 希望能显示 0~35之间 就是温度的 可以不要只能在0~1之间吗??
感谢
7F:→ doom8199:看错误讯息是如此@@'' 04/16 21:53
※ 编辑: y1027330 来自: 114.32.184.86 (04/16 22:03)
8F:推 vincent59:你可以参考10455 04/16 21:59
9F:推 abc01251:我加 uint8 就过了 你可以试试看 04/16 22:08
10F:→ abc01251:不过数字会跑掉XD 04/16 22:08
11F:推 okgogogo:不就只能0~1...B那麽大 04/16 22:09
※ 编辑: y1027330 来自: 114.32.184.86 (04/16 22:14)
12F:→ okgogogo:温度应该用 pcolor or contourf or colorbar 请查help 04/16 22:14
13F:→ y1027330:不加double 数字只会整是 我需要他的小数 04/16 22:14
※ 编辑: y1027330 来自: 114.32.184.86 (04/16 22:16)
14F:→ y1027330:V大 我有参考你在那边的推文 但我造着做就是一片黑 04/16 22:17
※ 编辑: y1027330 来自: 114.32.184.86 (04/16 22:19)
15F:推 doom8199:秀图有很多种方法,重点是你想要呈现何种数据 04/16 22:21
16F:→ doom8199:例如 x 和 y 同样是介於 0~1 的数据 04/16 22:22
17F:→ y1027330:我想呈现就是真实T61的值 04/16 22:22
18F:→ doom8199:只要做个如 y = x^n, n>0 的转换 04/16 22:23
19F:→ y1027330:比如我们点开 T61这个矩阵 他是多少 就想画出多少 QQ 04/16 22:23
20F:→ doom8199:intensity 就会有所改变 04/16 22:23
21F:→ doom8199:那你就是先把你想要的数据处理好,在调整为 0~1 or 0~255 04/16 22:25
22F:推 vincent59:会一片黑因为得再将值拉回255(imshow) 04/16 22:36
23F:→ vincent59:照doom8199教的方法试看看 04/16 22:37
24F:→ y1027330:那我想要她呈现值在0~255之间 我要怎麽做?? 04/16 22:38
25F:推 vincent59:首先B的范围?如果是0~1(资料型态:uint8) 04/16 22:45
26F:→ vincent59:那不难,B=B*255; 04/16 22:45
27F:→ y1027330:B的范围是0~255 04/16 22:46
28F:→ y1027330:应该说我们读的A是0~255然後再去做一些加减乘除 04/16 22:47
29F:→ y1027330:最後经过运算 就会落在大约是0~35 左右 04/16 22:47
30F:→ y1027330:刚好可以表达我们温度 当然代的那些常数是经验式得到 04/16 22:48
31F:→ y1027330:所以我希望画出来就是能呈现大约 0~35左右的图 04/16 22:48
32F:推 vincent59:所以最後你要的range是0~35罗?? 04/16 22:49
33F:→ y1027330:没错!!!!! 04/16 22:51
34F:推 vincent59:B=36*double(A)/23 这行算出来的range是0~255?? 04/16 22:53
35F:→ doom8199:0~35 那个是数据,并非是颜色 04/16 22:53
36F:→ y1027330:对!! 但我画的图 就是想呈现 0~35这个矩阵里面的数值 04/16 22:54
37F:→ doom8199:秀图跟你数据的范围没啥太大关系 04/16 22:54
38F:→ y1027330:拜托了 有什麽拜办法 04/16 22:54
39F:→ doom8199:所以你 35 那个数据,真的就代表 nrmalize graylevel 04/16 22:55
40F:→ doom8199:0~255 中的 35 ? 04/16 22:55
41F:→ y1027330:其实也不依定是35 这个值也只是运算後 大约的最大值 04/16 22:56
42F:推 vincent59:所以是数据呢还是颜色??? 04/16 22:56
43F:→ y1027330:对阿 因为这是前人的研究 所以他们是经过经验式 04/16 22:56
44F:→ y1027330:所以会很巧的 刚好把0~255的值换算後 大约就会介於0~35 04/16 22:57
45F:→ y1027330:所以就可以表达我们地区的温度 04/16 22:57
46F:→ y1027330:然後 我就想要画出这个值 04/16 22:58
47F:→ doom8199:所以那只是数据而已. 您只是想用颜色强度or鲜艳度来表示 04/16 22:59
48F:→ doom8199:0~35 的数据. 那就跟秀图的0~1 or 0~255 没关系 04/16 22:59
<--这之前没错 後面有点不懂
49F:→ doom8199:会要你把B的data 调整为 0~1 or 0~255 04/16 23:00
50F:→ doom8199:只是要你配合现有matlab 的函式+颜色表示你的数据而已 04/16 23:01
有点听不懂 把B的data 调整为 0~1 or 0~255
※ 编辑: y1027330 来自: 114.32.184.86 (04/16 23:02)
51F:→ doom8199:不要把 normalize 的color数据当成是你真的 0~35 数值 04/16 23:01
52F:推 doom8199:意思是,你要自己定义好颜色 c 跟数据 x 的关系 04/16 23:04
53F:→ y1027330:所以意思是 我换算後的T61 里面的值不是数值 是颜色的值 04/16 23:04
54F:→ y1027330:所以T61里面 就算是0~35 然後我就要去找一个函数 去把她 04/16 23:05
55F:→ y1027330:数值化 是这个意思吗??? 04/16 23:06
56F:推 vincent59:如同doom8199说明的 04/16 23:06
57F:→ abc01251:你的T61 是二维还三维?? 04/16 23:07
58F:推 vincent59:原po知道如何将颜色数值化吧??? 04/16 23:09
59F:→ y1027330:不知道 QQ 是三维 04/16 23:10
60F:→ abc01251:拟改成 imagesc(T61(:,:,1)); 我刚刚试过三维好像不能用 04/16 23:11
62F:→ vincent59:我先下线一下 doom8199真的满会了解别人想问什麽? 04/16 23:16
63F:→ y1027330:大约了解 我明天再问问别人 感谢两位 04/16 23:26
64F:→ doom8199:原po若还不太清楚 c 跟 x 要如何定义,就直接打 04/16 23:30
65F:→ doom8199:imshow(uint8(T61*255.0/40.0)) 04/16 23:32
66F:→ doom8199:打错,应该是 imshow(uint8((T61+5.0)*255.0/40.0)) 04/16 23:33
67F:→ y1027330:这样uint8打完 是不是会把小数点 用掉阿 我希望能保留 qq 04/16 23:56
68F:推 doom8199:若你想把它存成图档, 一样会做量化等动作阿XD 04/17 08:53
69F:→ doom8199:基本上您打 imshow((T61+5.0)/40.0)) 也是一样的意思 04/17 08:57
70F:→ doom8199:若您只是要保留资料,直接save就好,无须存成图档 04/17 08:58