機(jī)器視覺基礎(chǔ)——圖像保存
圖像是怎樣通過(guò)代碼,保存到我們的計(jì)算機(jī)的。在之前圖像的載入中,我們只是通過(guò)一句簡(jiǎn)單的代碼 "cv.imread" 便實(shí)現(xiàn)了,表面上看上去非常簡(jiǎn)單,只需一步便能實(shí)現(xiàn),但當(dāng)我們更深層次地去挖掘時(shí),實(shí)際上是經(jīng)歷了四個(gè)過(guò)程。
第一個(gè)是文件的讀取,第二個(gè)是文件封裝格式的解析,第三個(gè)是文件數(shù)據(jù)的解碼,第四個(gè)是數(shù)據(jù)的加載,總共有這樣四個(gè)過(guò)程。而直觀上看只有第一個(gè)和第四個(gè)過(guò)程,沒有中間兩個(gè)過(guò)程,這是因?yàn)橹虚g兩個(gè)過(guò)程在程序內(nèi)部就已經(jīng)幫我們完成了。
在這里涉及到兩個(gè)基礎(chǔ)概念,一個(gè)是封裝格式,另一個(gè)是數(shù)據(jù)解碼。我們先來(lái)看看什么是封裝格式。我們?nèi)粘I钪薪?jīng)常接觸到的 jpg、png 等文件格式就是這里所說(shuō)的圖像的封裝格式。而封裝格式一般又把圖像文件分成兩部分,第一部分是文件頭,第二部分是文件數(shù)據(jù),不同的封裝格式的文件頭和文件數(shù)據(jù)是完全不同的。
而且這里的文件數(shù)據(jù)也不是圖像的原始數(shù)據(jù),而是圖像進(jìn)行壓縮編碼之后的數(shù)據(jù)。文件頭多數(shù)描述的是數(shù)據(jù)部分的解碼信息以及附加信息,解碼器可以根據(jù)這些附加信息將文件數(shù)據(jù)恢復(fù)到圖像的原始數(shù)據(jù),所以這個(gè)過(guò)程非常的重要。
到這里,我們已經(jīng)了解了文件的封裝格式,接下來(lái)我們就可以根據(jù)自己需要的圖片格式完成圖片的保存功能了。
想要完成一張圖像的保存,第一步便是要載入一張圖像,這一步我們?cè)谥暗奈恼庐?dāng)中已經(jīng)實(shí)現(xiàn)過(guò)了,非常簡(jiǎn)單。在這里我們使用Python 和C兩種語(yǔ)言來(lái)實(shí)現(xiàn),Python 使用的是Pycharm編程軟件,C使用的是VS編程軟件。下面我們就來(lái)看看Python 語(yǔ)言和 C語(yǔ)言分別是怎樣實(shí)現(xiàn)的吧!
這兩種語(yǔ)言的代碼是不是很相似呀!我們只要了解其中一種代碼,另一種也就大同小異了。
接下來(lái),我們就一起來(lái)看看圖像究竟是怎樣保存的吧。圖像的保存也非常簡(jiǎn)單,一句代碼便可實(shí)現(xiàn)。先來(lái)看看效果如何,同樣使用 Python 和 C兩種語(yǔ)言來(lái)實(shí)現(xiàn)。
對(duì)于 imwrite 命令,有兩個(gè)參數(shù),第一個(gè)是圖片的保存路徑、名稱以及格式類型,第二個(gè)參數(shù)就是圖像數(shù)據(jù)了,這里的數(shù)據(jù)指的是經(jīng)過(guò)解碼之后的數(shù)據(jù)。通過(guò)這個(gè)實(shí)例,我們不難看出,保存的類型不同,在默認(rèn)情況下所占用的空間大小也相差較大,這也同時(shí)體現(xiàn)了我們上面所說(shuō)的不同封裝格式的文件頭和文件數(shù)據(jù)完全不同。
對(duì)于C 語(yǔ)言,使用窗體函數(shù),實(shí)現(xiàn)簡(jiǎn)單的交互界面,這樣在讀取圖像和保存圖像的時(shí)候非常方便。