最近在用tensorflow跑一點(diǎn)GANs的實(shí)驗(yàn),但是圖片生成的效果一直很爛,為此重新檢查了無(wú)數(shù)次的代碼扩氢,甚至各種改網(wǎng)絡(luò)結(jié)構(gòu),發(fā)現(xiàn)都是在做無(wú)用功爷辱。直到今天才發(fā)現(xiàn)录豺,是我用imshow函數(shù)展示生成圖片時(shí),圖片的數(shù)據(jù)類(lèi)型不對(duì)7构Kⅰ!導(dǎo)致了imshow不能正常顯示圖片5芏稀S交ā!
本文簡(jiǎn)單介紹一下MATLAB中圖像的數(shù)據(jù)類(lèi)型
- 在MATLAB(matplotlib也是如此)中阀趴,數(shù)值一般都采用double型(64位)存儲(chǔ)和運(yùn)算昏翰。
- 為了節(jié)省存儲(chǔ)空間,為圖像提供了特殊的數(shù)據(jù)類(lèi)型uint8(8位無(wú)符號(hào)整數(shù))刘急,以此方式存儲(chǔ)的圖像稱(chēng)為8位型像棚菊。
- 對(duì)于圖像數(shù)據(jù),uint8表示范圍[0叔汁,255]统求,double型表示范圍[0检碗,1]∏蚨可見(jiàn),double型和uint8型灰度圖像不一樣瑰钮,二者轉(zhuǎn)換格式為:
U=uint8 ('double'*255) --> double轉(zhuǎn)換成uint 8
D=double ('uint8') / 255. --> uint轉(zhuǎn)換成double
MATLAB中讀入圖像的數(shù)據(jù)類(lèi)型是uint8冒滩,而在矩陣中使用的數(shù)據(jù)類(lèi)型是double。因此進(jìn)行圖像數(shù)據(jù)的運(yùn)算時(shí)浪谴,需要將其轉(zhuǎn)換成double精度類(lèi)型开睡;如果不轉(zhuǎn)換,在對(duì)uint8進(jìn)行加減時(shí)會(huì)產(chǎn)生溢出苟耻。
幾種圖像數(shù)據(jù)格式轉(zhuǎn)換函數(shù):
- im2double():將圖象數(shù)組轉(zhuǎn)換成double精度類(lèi)型
- im2uint8():將圖象數(shù)組轉(zhuǎn)換成unit8類(lèi)型
- im2uint16():將圖象數(shù)組轉(zhuǎn)換成unit16類(lèi)型
MATLAB中用imshow()顯示圖像與圖像矩陣的數(shù)據(jù)類(lèi)型的關(guān)系
在MATLAB中篇恒,我們常使用imshow()函數(shù)來(lái)顯示圖像,而此時(shí)的圖像矩陣可能經(jīng)過(guò)了某種運(yùn)算凶杖,為了保證精度胁艰,經(jīng)過(guò)了運(yùn)算的圖像矩陣其數(shù)據(jù)類(lèi)型會(huì)從unit8型變成double型。如果直接運(yùn)行imshow()智蝠,我們會(huì)發(fā)現(xiàn)顯示的是一個(gè)白色的圖像腾么。這是因?yàn)閕mshow()顯示圖像時(shí)對(duì)double型默認(rèn)為在0~1范圍內(nèi),即大于1時(shí)都是顯示為白色杈湾,而imshow顯示uint8型時(shí)默認(rèn)是0~255范圍解虱。而經(jīng)過(guò)運(yùn)算的范圍在0-255之間的double型數(shù)據(jù)就被不正常得顯示為白色圖像了。
如何解決這個(gè)問(wèn)題呢漆撞?
1.imshow(I/255); 將圖像矩陣轉(zhuǎn)化到0-1的double類(lèi)型數(shù)據(jù)殴泰;
2.使用uint8轉(zhuǎn)換數(shù)據(jù)格式,再使用imshow()顯示浮驳。
我們剛才說(shuō)了uint8()函數(shù)和im2uint8()函數(shù)都可以將double類(lèi)型的數(shù)據(jù)轉(zhuǎn)換為uint8格式悍汛,那么兩者的區(qū)別是是什么?還是說(shuō)兩者的實(shí)現(xiàn)方式是一樣的至会?
uint的操作僅僅是將一個(gè)double類(lèi)型的小數(shù)點(diǎn)后面的部分去掉员凝;但是im2uint8是將輸入中所有小于0的數(shù)設(shè)置為0,而將輸入中所有大于1的數(shù)值設(shè)置為255奋献,再將所有其他值乘以255健霹。