作者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