uint8、double、mat2uint、imhist繪直方圖w恩替藐視
阿新 • • 發佈:2019-02-16
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。
3. 關於imhist:
imhist(I)顯示影象I的直方圖,影象的灰度數由影象型別指定,如果I為灰度影象,imhist使用一個預設的256值,如果I為二值影象,imhist則使用2值。 修訂後的程式碼:
或者,一開始就進行uint8向影象標準型別double轉換,利用im2double函式<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>
<span style="font-size:18px;">ImgUS = imread('050.bmp');
Igray = rgb2gray(ImgUS);
Igray = im2double(Igray);%標準化成影象double
figure,imshow(Igray);
figure;imhist(Igray );</span>