1. 程式人生 > >uint8、double、mat2uint、imhist繪直方圖w恩替藐視

uint8、double、mat2uint、imhist繪直方圖w恩替藐視

1.問題描述

<span style="font-size:18px;">ImgUS = imread('050.bmp');
Igray = rgb2gray(ImgUS);
Igray = double(Igray);
figure,imshow(Igray ,[]);
figure;imhist(Igray);</span>

影象可以正常顯示,但是灰度直方圖卻無法顯示。

2.解答:

2.1 網友的說法:

     預設情況下,matlab將影象中的資料儲存為double型,即64位浮點數;matlab還支援無符號整型(uint8和uint16);uint型的優勢在於節省空間,涉及運算時要轉換成double型。

2.2 真實的原因:

   問題的真正的解釋其實應該是這樣的。

   首先是在資料型別轉換時候uint8和im2uint8的區別,uint的操作僅僅是將一個double型別的小數點後面的部分去掉;但是im2uint8是將輸入中所有小於0的數設定為0,而將輸入中所有大於1的數值設定為255,再將所有其他值乘以255。
影象資料在進行計算前要轉化為double型別的這樣可以保證影象資料運算的精度。很
多矩陣的資料也都是double的,要想顯示,必須先轉換為影象的標準資料格式。如果轉換前的資料符合影象資料標準(比如,如果是double則要位於0~1之間,這個是由Matlab中的規定),那麼可以直接使用im2uint8。
    如果轉換前不滿足這個分佈規律(也就是我們草草的用double強制將uint變成double型),則使用uint8,將其自動切割至0~255(超過255的按255)最好使用mat2gray(這個函式可以把一個double類的任意陣列轉換成取值範圍在[0,1]之間的),將一個矩陣轉化為灰度影象的資料格式(double)。另外,可以用isgray判斷矩陣是否是一個影象資料矩陣。

3. 關於imhist:

imhist(I) 
顯示影象I的直方圖,影象的灰度數由影象型別指定,如果I為灰度影象,imhist使用一個預設的256值,如果I為二值影象,imhist則使用2值。 修訂後的程式碼:
<span style="font-size:18px;">ImgUS = imread('050.bmp');
Igray = rgb2gray(ImgUS);
Igray = double(Igray);
figure,imshow(Idenoise,[]);
Igray = mat2gray(Igray);%標準化成影象double
figure;imhist(Igray);</span>
或者,一開始就進行uint8向影象標準型別double轉換,利用im2double函式
<span style="font-size:18px;">ImgUS = imread('050.bmp');
Igray = rgb2gray(ImgUS);
Igray = im2double(Igray);%標準化成影象double
figure,imshow(Igray);
figure;imhist(Igray );</span>