[繪圖] uint8轉化 畫圖的問題

看板MATLAB作者 (leon)時間12年前 (2012/04/16 21:31), 編輯推噓15(15055)
留言70則, 5人參與, 最新討論串1/1
讀取圖片檔(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

04/16 21:49, , 1F
你確定錯在那行嗎 我打 沒問題 可以過
04/16 21:49, 1F

04/16 21:52, , 2F
imagesc(uint8(B)); << 這邊吧~
04/16 21:52, 2F

04/16 21:52, , 3F
因為 imagesc 函式要求值要介於 0~1
04/16 21:52, 3F

04/16 21:52, , 4F
我也覺得沒問題???
04/16 21:52, 4F

04/16 21:53, , 5F
若你是讀取 rgb 圖片,要先除以 255.0
04/16 21:53, 5F

04/16 21:53, , 6F
所以原po問的是秀圖的部分??
04/16 21:53, 6F
恩恩 很像真的是後面我畫imagesc(B) 需要在0~1之間 但我的圖 希望能顯示 0~35之間 就是溫度的 可以不要只能在0~1之間嗎?? 感謝

04/16 21:53, , 7F
看錯誤訊息是如此@@''
04/16 21:53, 7F
※ 編輯: y1027330 來自: 114.32.184.86 (04/16 22:03)

04/16 21:59, , 8F
你可以參考10455
04/16 21:59, 8F

04/16 22:08, , 9F
我加 uint8 就過了 你可以試試看
04/16 22:08, 9F

04/16 22:08, , 10F
不過數字會跑掉XD
04/16 22:08, 10F

04/16 22:09, , 11F
不就只能0~1...B那麼大
04/16 22:09, 11F
※ 編輯: y1027330 來自: 114.32.184.86 (04/16 22:14)

04/16 22:14, , 12F
溫度應該用 pcolor or contourf or colorbar 請查help
04/16 22:14, 12F

04/16 22:14, , 13F
不加double 數字只會整是 我需要他的小數
04/16 22:14, 13F
※ 編輯: y1027330 來自: 114.32.184.86 (04/16 22:16)

04/16 22:17, , 14F
V大 我有參考你在那邊的推文 但我造著做就是一片黑
04/16 22:17, 14F
※ 編輯: y1027330 來自: 114.32.184.86 (04/16 22:19)

04/16 22:21, , 15F
秀圖有很多種方法,重點是你想要呈現何種數據
04/16 22:21, 15F

04/16 22:22, , 16F
例如 x 和 y 同樣是介於 0~1 的數據
04/16 22:22, 16F

04/16 22:22, , 17F
我想呈現就是真實T61的值
04/16 22:22, 17F

04/16 22:23, , 18F
只要做個如 y = x^n, n>0 的轉換
04/16 22:23, 18F

04/16 22:23, , 19F
比如我們點開 T61這個矩陣 他是多少 就想畫出多少 QQ
04/16 22:23, 19F

04/16 22:23, , 20F
intensity 就會有所改變
04/16 22:23, 20F

04/16 22:25, , 21F
那你就是先把你想要的數據處理好,在調整為 0~1 or 0~255
04/16 22:25, 21F

04/16 22:36, , 22F
會一片黑因為得再將值拉回255(imshow)
04/16 22:36, 22F

04/16 22:37, , 23F
照doom8199教的方法試看看
04/16 22:37, 23F

04/16 22:38, , 24F
那我想要她呈現值在0~255之間 我要怎麼做??
04/16 22:38, 24F

04/16 22:45, , 25F
首先B的範圍?如果是0~1(資料型態:uint8)
04/16 22:45, 25F

04/16 22:45, , 26F
那不難,B=B*255;
04/16 22:45, 26F

04/16 22:46, , 27F
B的範圍是0~255
04/16 22:46, 27F

04/16 22:47, , 28F
應該說我們讀的A是0~255然後再去做一些加減乘除
04/16 22:47, 28F

04/16 22:47, , 29F
最後經過運算 就會落在大約是0~35 左右
04/16 22:47, 29F

04/16 22:48, , 30F
剛好可以表達我們溫度 當然代的那些常數是經驗式得到
04/16 22:48, 30F

04/16 22:48, , 31F
所以我希望畫出來就是能呈現大約 0~35左右的圖
04/16 22:48, 31F

04/16 22:49, , 32F
所以最後你要的range是0~35囉??
04/16 22:49, 32F

04/16 22:51, , 33F
沒錯!!!!!
04/16 22:51, 33F

04/16 22:53, , 34F
B=36*double(A)/23 這行算出來的range是0~255??
04/16 22:53, 34F

04/16 22:53, , 35F
0~35 那個是數據,並非是顏色
04/16 22:53, 35F

04/16 22:54, , 36F
對!! 但我畫的圖 就是想呈現 0~35這個矩陣裡面的數值
04/16 22:54, 36F

04/16 22:54, , 37F
秀圖跟你數據的範圍沒啥太大關係
04/16 22:54, 37F

04/16 22:54, , 38F
拜託了 有什麼拜辦法
04/16 22:54, 38F

04/16 22:55, , 39F
所以你 35 那個數據,真的就代表 nrmalize graylevel
04/16 22:55, 39F

04/16 22:55, , 40F
0~255 中的 35 ?
04/16 22:55, 40F

04/16 22:56, , 41F
其實也不依定是35 這個值也只是運算後 大約的最大值
04/16 22:56, 41F

04/16 22:56, , 42F
所以是數據呢還是顏色???
04/16 22:56, 42F

04/16 22:56, , 43F
對阿 因為這是前人的研究 所以他們是經過經驗式
04/16 22:56, 43F

04/16 22:57, , 44F
所以會很巧的 剛好把0~255的值換算後 大約就會介於0~35
04/16 22:57, 44F

04/16 22:57, , 45F
所以就可以表達我們地區的溫度
04/16 22:57, 45F

04/16 22:58, , 46F
然後 我就想要畫出這個值
04/16 22:58, 46F

04/16 22:59, , 47F
所以那只是數據而已. 您只是想用顏色強度or鮮豔度來表示
04/16 22:59, 47F

04/16 22:59, , 48F
0~35 的數據. 那就跟秀圖的0~1 or 0~255 沒關係
04/16 22:59, 48F
<--這之前沒錯 後面有點不懂

04/16 23:00, , 49F
會要你把B的data 調整為 0~1 or 0~255
04/16 23:00, 49F

04/16 23:01, , 50F
只是要你配合現有matlab 的函式+顏色表示你的數據而已
04/16 23:01, 50F
有點聽不懂 把B的data 調整為 0~1 or 0~255 ※ 編輯: y1027330 來自: 114.32.184.86 (04/16 23:02)

04/16 23:01, , 51F
不要把 normalize 的color數據當成是你真的 0~35 數值
04/16 23:01, 51F

04/16 23:04, , 52F
意思是,你要自己定義好顏色 c 跟數據 x 的關係
04/16 23:04, 52F

04/16 23:04, , 53F
所以意思是 我換算後的T61 裡面的值不是數值 是顏色的值
04/16 23:04, 53F

04/16 23:05, , 54F
所以T61裡面 就算是0~35 然後我就要去找一個函數 去把她
04/16 23:05, 54F

04/16 23:06, , 55F
數值化 是這個意思嗎???
04/16 23:06, 55F

04/16 23:06, , 56F
如同doom8199說明的
04/16 23:06, 56F

04/16 23:07, , 57F
你的T61 是二維還三維??
04/16 23:07, 57F

04/16 23:09, , 58F
原po知道如何將顏色數值化吧???
04/16 23:09, 58F

04/16 23:10, , 59F
不知道 QQ 是三維
04/16 23:10, 59F

04/16 23:11, , 60F
擬改成 imagesc(T61(:,:,1)); 我剛剛試過三維好像不能用
04/16 23:11, 60F

04/16 23:15, , 61F
http://ppt.cc/I9@0 先稍微看一下
04/16 23:15, 61F

04/16 23:16, , 62F
我先下線一下 doom8199真的滿會暸解別人想問什麼?
04/16 23:16, 62F

04/16 23:26, , 63F
大約了解 我明天再問問別人 感謝兩位
04/16 23:26, 63F

04/16 23:30, , 64F
原po若還不太清楚 c 跟 x 要如何定義,就直接打
04/16 23:30, 64F

04/16 23:32, , 65F
imshow(uint8(T61*255.0/40.0))
04/16 23:32, 65F

04/16 23:33, , 66F
打錯,應該是 imshow(uint8((T61+5.0)*255.0/40.0))
04/16 23:33, 66F

04/16 23:56, , 67F
這樣uint8打完 是不是會把小數點 用掉阿 我希望能保留 qq
04/16 23:56, 67F

04/17 08:53, , 68F
若你想把它存成圖檔, 一樣會做量化等動作阿XD
04/17 08:53, 68F

04/17 08:57, , 69F
基本上您打 imshow((T61+5.0)/40.0)) 也是一樣的意思
04/17 08:57, 69F

04/17 08:58, , 70F
若您只是要保留資料,直接save就好,無須存成圖檔
04/17 08:58, 70F
文章代碼(AID): #1FZ1z63Y (MATLAB)
文章代碼(AID): #1FZ1z63Y (MATLAB)