作者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
→ abc01251:你確定錯在那行嗎 我打 沒問題 可以過 04/16 21:49
→ abc01251:imagesc(uint8(B)); << 這邊吧~ 04/16 21:52
→ doom8199:因為 imagesc 函式要求值要介於 0~1 04/16 21:52
推 vincent59:我也覺得沒問題??? 04/16 21:52
→ doom8199:若你是讀取 rgb 圖片,要先除以 255.0 04/16 21:53
→ vincent59:所以原po問的是秀圖的部分?? 04/16 21:53
恩恩 很像真的是後面我畫imagesc(B) 需要在0~1之間
但我的圖 希望能顯示 0~35之間 就是溫度的 可以不要只能在0~1之間嗎??
感謝
→ doom8199:看錯誤訊息是如此@@'' 04/16 21:53
※ 編輯: y1027330 來自: 114.32.184.86 (04/16 22:03)
推 vincent59:你可以參考10455 04/16 21:59
推 abc01251:我加 uint8 就過了 你可以試試看 04/16 22:08
→ abc01251:不過數字會跑掉XD 04/16 22:08
推 okgogogo:不就只能0~1...B那麼大 04/16 22:09
※ 編輯: y1027330 來自: 114.32.184.86 (04/16 22:14)
→ okgogogo:溫度應該用 pcolor or contourf or colorbar 請查help 04/16 22:14
→ y1027330:不加double 數字只會整是 我需要他的小數 04/16 22:14
※ 編輯: y1027330 來自: 114.32.184.86 (04/16 22:16)
→ y1027330:V大 我有參考你在那邊的推文 但我造著做就是一片黑 04/16 22:17
※ 編輯: y1027330 來自: 114.32.184.86 (04/16 22:19)
推 doom8199:秀圖有很多種方法,重點是你想要呈現何種數據 04/16 22:21
→ doom8199:例如 x 和 y 同樣是介於 0~1 的數據 04/16 22:22
→ y1027330:我想呈現就是真實T61的值 04/16 22:22
→ doom8199:只要做個如 y = x^n, n>0 的轉換 04/16 22:23
→ y1027330:比如我們點開 T61這個矩陣 他是多少 就想畫出多少 QQ 04/16 22:23
→ doom8199:intensity 就會有所改變 04/16 22:23
→ doom8199:那你就是先把你想要的數據處理好,在調整為 0~1 or 0~255 04/16 22:25
推 vincent59:會一片黑因為得再將值拉回255(imshow) 04/16 22:36
→ vincent59:照doom8199教的方法試看看 04/16 22:37
→ y1027330:那我想要她呈現值在0~255之間 我要怎麼做?? 04/16 22:38
推 vincent59:首先B的範圍?如果是0~1(資料型態:uint8) 04/16 22:45
→ vincent59:那不難,B=B*255; 04/16 22:45
→ y1027330:B的範圍是0~255 04/16 22:46
→ y1027330:應該說我們讀的A是0~255然後再去做一些加減乘除 04/16 22:47
→ y1027330:最後經過運算 就會落在大約是0~35 左右 04/16 22:47
→ y1027330:剛好可以表達我們溫度 當然代的那些常數是經驗式得到 04/16 22:48
→ y1027330:所以我希望畫出來就是能呈現大約 0~35左右的圖 04/16 22:48
推 vincent59:所以最後你要的range是0~35囉?? 04/16 22:49
→ y1027330:沒錯!!!!! 04/16 22:51
推 vincent59:B=36*double(A)/23 這行算出來的range是0~255?? 04/16 22:53
→ doom8199:0~35 那個是數據,並非是顏色 04/16 22:53
→ y1027330:對!! 但我畫的圖 就是想呈現 0~35這個矩陣裡面的數值 04/16 22:54
→ doom8199:秀圖跟你數據的範圍沒啥太大關係 04/16 22:54
→ y1027330:拜託了 有什麼拜辦法 04/16 22:54
→ doom8199:所以你 35 那個數據,真的就代表 nrmalize graylevel 04/16 22:55
→ doom8199:0~255 中的 35 ? 04/16 22:55
→ y1027330:其實也不依定是35 這個值也只是運算後 大約的最大值 04/16 22:56
推 vincent59:所以是數據呢還是顏色??? 04/16 22:56
→ y1027330:對阿 因為這是前人的研究 所以他們是經過經驗式 04/16 22:56
→ y1027330:所以會很巧的 剛好把0~255的值換算後 大約就會介於0~35 04/16 22:57
→ y1027330:所以就可以表達我們地區的溫度 04/16 22:57
→ y1027330:然後 我就想要畫出這個值 04/16 22:58
→ doom8199:所以那只是數據而已. 您只是想用顏色強度or鮮豔度來表示 04/16 22:59
→ doom8199:0~35 的數據. 那就跟秀圖的0~1 or 0~255 沒關係 04/16 22:59
<--這之前沒錯 後面有點不懂
→ doom8199:會要你把B的data 調整為 0~1 or 0~255 04/16 23:00
→ doom8199:只是要你配合現有matlab 的函式+顏色表示你的數據而已 04/16 23:01
有點聽不懂 把B的data 調整為 0~1 or 0~255
※ 編輯: y1027330 來自: 114.32.184.86 (04/16 23:02)
→ doom8199:不要把 normalize 的color數據當成是你真的 0~35 數值 04/16 23:01
推 doom8199:意思是,你要自己定義好顏色 c 跟數據 x 的關係 04/16 23:04
→ y1027330:所以意思是 我換算後的T61 裡面的值不是數值 是顏色的值 04/16 23:04
→ y1027330:所以T61裡面 就算是0~35 然後我就要去找一個函數 去把她 04/16 23:05
→ y1027330:數值化 是這個意思嗎??? 04/16 23:06
推 vincent59:如同doom8199說明的 04/16 23:06
→ abc01251:你的T61 是二維還三維?? 04/16 23:07
推 vincent59:原po知道如何將顏色數值化吧??? 04/16 23:09
→ y1027330:不知道 QQ 是三維 04/16 23:10
→ abc01251:擬改成 imagesc(T61(:,:,1)); 我剛剛試過三維好像不能用 04/16 23:11
→ vincent59:我先下線一下 doom8199真的滿會暸解別人想問什麼? 04/16 23:16
→ y1027330:大約了解 我明天再問問別人 感謝兩位 04/16 23:26
→ doom8199:原po若還不太清楚 c 跟 x 要如何定義,就直接打 04/16 23:30
→ doom8199:imshow(uint8(T61*255.0/40.0)) 04/16 23:32
→ doom8199:打錯,應該是 imshow(uint8((T61+5.0)*255.0/40.0)) 04/16 23:33
→ y1027330:這樣uint8打完 是不是會把小數點 用掉阿 我希望能保留 qq 04/16 23:56
推 doom8199:若你想把它存成圖檔, 一樣會做量化等動作阿XD 04/17 08:53
→ doom8199:基本上您打 imshow((T61+5.0)/40.0)) 也是一樣的意思 04/17 08:57
→ doom8199:若您只是要保留資料,直接save就好,無須存成圖檔 04/17 08:58