談談matlab中的uint8和double(轉)


今天在寫圖像灰度反轉時,發現得到的結果不對,最后發現是圖像數據類型的問題,分析一下matlab的數據類型。

 

先貼一下代碼:



[html]  view plain copy print ?
  1. <PRE></PRE>  
  2. <P><SPAN style="FONT-SIZE: 18px; FONT-FAMILY: Microsoft YaHei">起初,沒有紅色的行,顯示結果如下(左邊是原圖,右邊是處理后的圖):</SPAN></P>  
  3. <SPAN style="FONT-SIZE: 18px; FONT-FAMILY: 微軟雅黑"></SPAN>  
  4. <P><IMG alt="" src="http://hi.csdn.net/attachment/201203/13/0_1331647160Iba4.gif"></P>  
  5. <P><SPAN style="FONT-SIZE: 18px; FONT-FAMILY: Microsoft YaHei">加上紅色的行后,顯示如下:</SPAN></P>  
  6. <P><SPAN style="FONT-SIZE: 18px; FONT-FAMILY: Microsoft YaHei"><IMG alt="" src="http://hi.csdn.net/attachment/201203/13/0_13316472725Dwj.gif"></SPAN></P>  
  7. <SPAN style="FONT-SIZE: 18px; FONT-FAMILY: Microsoft YaHei"></SPAN>  
  8. <PRE></PRE>  

起初,沒有紅色的行,顯示結果如下(左邊是原圖,右邊是處理后的圖): 
 
加上紅色的行后,顯示如下: 
 
         

灰度反轉代碼比較簡單,起初也弄不清問題出在哪里,想能出問題的地方也就zeros 和imshow函數,查了一下這兩個函數,果然找到問題。

先看zeros函數:

zeros函數族中有個函數為: zeros(m, n ,... classname) ,其中classname可以取“double”, "uint8", "int8"等等(默認取double). 正因為zeros默認類型是double才導致我一開始的錯誤。(其實,matlab中的圖像經過運算后類型都會轉化為double,這樣可以防止溢出,並保證精度)

在一開始,矩陣J的數據類型為double, 在進行了下面的反轉運算后,J中的值的取值范圍為[0  255] ,下面我們再看一下imshow函數的一段說明:

 

[html]  view plain copy print ?
  1. <SPAN style="FONT-SIZE: 16px">% If your grayscale image is single or double, the default display range is  
  2. %   [0 1]. If your image's data range is much larger or smaller than the default  
  3. %    display range, you may need to experiment with setting the display range to  
  4. %    see features in the image that would not be visible using the default  
  5. %    display range. For all grayscale images having integer types, the default  
  6. %   display range is [intmin(class(I)) intmax(class(I))].  
  7. </SPAN>   

即,如果imshow的參數類型為double ,那么參數的取值范圍只有在[0 1]才會正常顯示。當值大於1時,都顯示白色。這與matlab的傳統是一致的, 對於灰度圖像,uint8表示范圍是[0 255] ,double表示范圍是[0 1]

正因為imshow的限制,我才在一開始沒有得出正確的結果。

但是,imshow函數的一個重載形式可以幫助我們解決這個問題, imshow(I, [low high]) (具體可以查看help) ,如果我們使用imshow(I, []) ,那么imshow將使用范圍[min(I(:)), max(I(:))] ,即圖像I中的最小值顯示為黑色,最大值顯示為白色(屬於圖像灰度拉伸的方法)

解決:

       1.如上面程序做法,顯示的將J轉化為uint8類型

       2.如上面所述, 使用J =zeros(m,n,'uint8')

           3. 使用imshow(J,[])

       4. imshow(J/256)

           但是上面各種方法的效果還是有區別的,我實驗了最后兩個方法的效果,發現方法3的對比要強烈一些 ,如下圖:

       

默認情況下, matlab將圖像的數據類型存儲為double型。當然,matlab為了節省空間,支持uint8, uint16等。但是在運算時最好轉化為double型,這樣可以保證計算的精度,也會防止溢出。當然,如果要顯示圖像,還是要調整為圖像的標准數據格式。

 

im2uint8 和 uint8 都是將圖像數據轉化為uint8 ,前者要求被轉化的數據必須是符合圖像數據標准(如:double [0 1]) ,而uint8則不必,它會自動截斷數據

 

im2double 和double 。double就是將一個數據的類型轉化為double ,但是數值不變;im2double將輸入的uint8或uint16歸一化到[0 1]區間 ,如果輸入是double,則不進行歸一化。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM