背景:數(shù)字圖像處理(DIP)入門時對matlab中的圖片在不同情況下的數(shù)據(jù)類型不太理解,其中包括imread()橡庞、mat2gray()戏仓、int8()等函數(shù),在這里簡單整理一下客冈。
首先需要明確imread()得到數(shù)據(jù)類型多數(shù)情況下為unsigned char類型旭从。數(shù)據(jù)范圍為1-255。 這時用imshow()顯示圖像的時候郊酒, imshow()會認為輸入矩陣的范圍在0-255遇绞, 如果imshow的參數(shù)為double類型的,那么imshow認為輸入矩陣的值為0-1燎窘。imread()的文檔如下image1摹闽。
imshow()的用法:
imshow(I)以圖形的形式顯示灰度圖像I。imshow為圖像顯示優(yōu)化圖形褐健、軸和圖像對象屬性付鹿。
imshow(I澜汤,[low - high])顯示灰度圖像I,指定顯示范圍為二元向量[low - high]舵匾。有關(guān)更多信息俊抵,請參見DisplayRange參數(shù)。
imshow(I坐梯,[])顯示灰度圖像I徽诲,根據(jù)I中的像素值范圍縮放顯示。imshow使用[min(I(:))) max(I(:(:))]作為顯示范圍吵血。imshow將I中的最小值顯示為黑色谎替,最大值顯示為白色。有關(guān)更多信息蹋辅,請參見DisplayRange參數(shù)钱贯。
imshow()的官方文檔如下圖image2:
當涉及到頻域等處理時候,或進行如拉普拉斯濾波時濾波器中有負數(shù)值侦另,需要轉(zhuǎn)換成double類型秩命,否則負數(shù)會被置零處理結(jié)果出錯,需要將字節(jié)型數(shù)據(jù)轉(zhuǎn)換為double類型褒傅,matlab提供了2兩個函數(shù)弃锐,im2double和double函數(shù),均可使用樊卓,兩者的區(qū)別則極其重要拿愧,直接用double轉(zhuǎn)換以后用imshow()顯示的是一片白色杠河, 是因為當imshow()顯示圖像的時候碌尔, 會認為double類型的圖像矩陣的范圍在0-1,小于0的像素被置零券敌, 超過1的像素值當作1處理唾戚, 這樣就是幾乎所有的像素都是白色。如果想要正常imshow()顯示double類型的數(shù)據(jù)可以用mat2gray()處理一下待诅。
mat2gray ? 把一個double類的任意數(shù)組轉(zhuǎn)換成值范圍在[0,1]的歸一化double類數(shù)組叹坦。
im2double 函數(shù)將所有像素數(shù)據(jù)轉(zhuǎn)化為[0 1]區(qū)間之內(nèi),這也是數(shù)字圖像處理工具箱的要求,但是double函數(shù)則僅僅提高數(shù)據(jù)精度卑雁,但是并未將數(shù)據(jù)量化到[0 1]區(qū)間之內(nèi)募书。
綜合效果如下圖image3所示。
適應(yīng)場合:當你需要做頻域濾波處理测蹲,需要注意不要使用im2double函數(shù)莹捡,否則濾波之后,圖像在傅里葉反變換之后扣甲,所有像素數(shù)據(jù)都是0篮赢,也就是說圖像純黑色。與此對應(yīng),當你使用數(shù)字圖像處理工具箱的時候启泣,建議使用im2double函數(shù)涣脚。
如果一個圖像經(jīng)過處理后需要顯示出來,但是圖像的最大像素值遠小于255寥茫,此時是用imshow()還是用imshow(i,[])?
這一點曾使我迷惑遣蚀,但經(jīng)過對比原圖像的像素值和處理后的像素值不難發(fā)現(xiàn)可能兩幅圖像的最大像素值都遠小于255,這樣的話就不難理解纱耻,此時應(yīng)該直接用imshow()顯示結(jié)果妙同,如果將原圖像映射到[0-1]或者[0-255]再顯示就相當于把圖像對比度拉伸了,拉伸后的圖像就不是原圖像了膝迎,拉伸后的圖像視覺效果會更好一些粥帚,畢竟對比度被提高了。對比下圖中image4的‘prcessed image’和下面兩幅擴展后的圖可以看出差異限次。
im2uint8 ?將輸入數(shù)據(jù)映射到1-255上芒涡,數(shù)據(jù)中所有小于0的設(shè)置為0,而將輸入中所有大于1的設(shè)置為255, 其他的所有乘以255卖漫,此時就可以直接用imshow()顯示數(shù)據(jù)费尽。
im2uint16與im2uint8類似。
能想到的暫且就這些羊始。