在matlab中,咱們常使用imshow()函數來顯示圖像,而此時的圖像矩陣可能通過了某種運算。在matlab中,爲了保證精度,通過了運算的圖像矩陣I其數據類型會從unit8型變成double型。若是直接運行imshow(I),咱們會發現顯示的是一個白色的圖像。這是由於imshow()顯示圖像時對double型是認爲在0~1範圍內,即大於1時都是顯示爲白色,而imshow顯示uint8型時是0~255範圍。而通過運算的範圍在0-255之間的double型數據就被不正常得顯示爲白色圖像了。 javascript
那麼如何解決這個問題呢?筆者曾經用fix()函數把圖像矩陣由實數形式轉化成整數形式,但這樣仍沒法改變圖像矩陣是double型的事實。 java
經過搜索,找到兩個解決方法: 函數
imshow(I/256); ----------將圖像矩陣轉化到0-1之間 ui
imshow(I,[]); -----------自動調整數據的範圍以便於顯示 (不明白原理!) spa
從實驗結果看兩種方法都解決了問題,可是從顯示的圖像看,第二種方法顯示的圖像明暗黑白對比的強烈些!不知什麼原理! ip
此外還找到一些方法,尚未試過,記錄以下:it
圖像數據在計算前須要轉換爲double,以保證精度; 不少矩陣數據也都是double的,要想顯示其,必須先轉換爲圖像的標準數據格式. 若是轉換前的數據符合圖像數據標準(好比若是是double則要位於0~1之間),那麼能夠直接使用im2uint8 class
若是轉換前的數據分佈不合規律,則使用uint8,將其自動切割至0~255(超過255的按255) 原理
最好使用mat2gray,將一個矩陣轉化爲灰度圖像的數據格式(double) 搜索
例如:imwrite(mat2gray(subimg),'fang ai chun_t1_328_864_666.png','bitdepth',8);
上述的subimg是uint16格式的文件;
另外,能夠用isgray判斷矩陣是不是一個圖像數據矩陣
總之,im2uint八、im2double要跟uint八、double