第3章
圖形和圖像的資料表現
現本章介紹圖像及其資料表現形式。我們将依次介紹1位圖像、8位灰階圖像,以及繪制它們的方法,最後介紹24位彩色圖和8位彩色圖。此外還會讨論一些用于存儲這種圖像的檔案格式的細節。
本章内容涉及如下主題:
●圖形/圖像的資料類型。
●常用的檔案格式。
3.1 圖形/圖像的資料類型
多媒體的檔案格式數量處于不斷增長之中[1]。比如,表3.1列舉了Adobe Premiere中可以使用的檔案格式。本章将介紹一部分常見的檔案格式,并闡述它們的工作方式。我們将重點關注GIF和JPG檔案格式,GIF檔案格式比較簡單且包含了一些基本的特征,JPG則是最重要的一種檔案格式。

接下來,我們将大緻了解一下檔案格式的特性。
3.1.1 1位圖像
圖像由像素(pixel)組成,像素是數字圖像中的圖檔元素。一幅1位圖像僅僅由“開”位和“關”位組成,這就是最簡單的圖像格式。圖像的每個像素由記憶體空間中的一個位來存儲(0或1)。是以,這樣一幅圖像稱為二值圖像。
二值圖像又被稱為1位單色(monochrome)圖像,因為它不包含其他顔色。圖3.1顯示了一幅1位單色圖像(多媒體科學家稱之為“Lena”,這是一幅标準圖像,用來說明許多算法)。一幅分辨率為640×480的單色圖像需要38.4KB(即640×480/8)的存儲空間。1位單色圖像适用于僅含有簡單圖形和文本的圖檔。此外,傳真機也使用1位圖像。盡管現在存儲性能已大幅提升,可以存儲攜帶更多資訊的圖像,但1位圖像仍然非常重要。
3.1.2 8位灰階圖像
8位圖像是指圖像的每個像素有一個0~255之間的灰階值(gray value),每個像素由一個位元組表示。例如,一個暗的像素的灰階值可能為10,而一個亮的像素的灰階值可能為230。
8位圖像可以看作由像素值組成的二維數組。這樣一個二維數組稱為一幅位圖(bitmap),作為圖形或圖像的資料表現,它與圖形或圖像在視訊記憶體中的存儲方法相似。
圖像分辨率(image resolution)指的是數字圖像中的像素數目(分辨率越高則圖像品質越好)。對一幅圖像而言,較高的分辨率可能是1600×1200,而稍低的分辨率可能是640×480。注意,這裡使用4∶3的螢幕長寬比,我們不一定要使用這個比例,但是這個比例看起來更自然,是以早期的電視和筆記本電腦螢幕都是4∶3(見第5章)。後來的顯示裝置大多使用16∶9的長寬比以更好地與高清視訊相比對。
我們稱存儲二維數組的硬體裝置為幀緩存(frame buffer),幀緩存封裝在被稱為“視訊”卡(實際上是圖形卡)的相對昂貴的特殊硬體中。視訊卡的分辨率不必達到圖像要求的分辨率,但是如果視訊卡沒有足夠的存儲空間,資料為了顯示就不得不在RAM中置換。
我們可以把8位圖圖像看作一組1位位平面(bitplane),其中每個平面由圖像的1位表示組成,如果圖像的像素在某個位的值不為0,則這個值被置為1。
圖3.2顯示了位平面的概念。每個位平面的每個像素具有值0或1。所有的位平面的對應像素的位組成一個位元組,用來存儲0~255之間(8位情形下)的某個值。對于最低有效位,在二進制的最終數字和中,該位的值變為0或1。位置算法隐含着對于下一個(即第二個)位,該位的0或1對最終和的貢獻是0或2。接下去的位代表0或4、0或8等,直到最高有效位貢獻值為0或128。視訊卡能夠以視訊速率重新整理位平面的資料,但是不像RAM那樣能很好地儲存資料。在北美,光栅場以每秒60個周期的速度重新整理,在歐洲重新整理速率為50。
每個像素通常用一個位元組存儲(值從0~255),是以一幅640×480的灰階圖像需要300KB的存儲空間(640×480=307200)。圖3.3再次顯示了Lena圖像,這次是一幅灰階圖。
如果我們想列印(print)這樣一幅圖,可能會遇到一些困難。假設我們有一個600dpi的雷射列印機。這樣的裝置通常隻能列印一個點或者不列印一個點。然而,将一幅600×600的圖像列印在一平方英寸的空間内,最終的效果并不是很好。此時采用抖動(dithering,也稱為抖色)方法。它的基本政策是以亮度分辨率換取空間分辨率。59(文獻[2]詳細介紹抖動)。
抖動
在1位列印機上列印時,抖動用于計算較大的點圖案,這樣,0到255之間的值可以對應于正确表示明暗像素值的圖案。主要的政策是用較大的圖案(例如2×2或4×4)替換像素值,這樣列印的點的數量就接近于用網版列印(halftone printing)的不同大小的圓盤字圖案。網闆列印是一種用于報紙印刷的模拟過程,使用較小或較大的黑油墨實心圓來表示陰影。
如果我們用n×n的開關1位點矩陣來代替,就能表現n2+1級亮度分辨率。比如,矩陣中任意三點被列印成黑色可算作一個亮度級。點模式用試探法建立。比如,用一個2×2的“抖動矩陣”:
我們可以先用除數是2565的整數除法把0~255間的圖像的值映射到一個新的範圍0~4。接下來,如果像素值是0,那麼在列印機的一個2×2輸出區域不進行列印;但如果像素值是4,則在4個點都填塗。是以規則如下:
如果像素亮度比抖動矩陣的某個元素的編号大,則在該元素填塗,即用一個n×n的點矩陣替代每個像素。
然而,我們注意到上述這種列印方式的亮度級數量還是太小。如果我們通過增加抖動矩陣的大小來增加亮度級數量,那麼也會增加輸出圖像的大小。這就降低了圖像在任何局部的清晰度,同時降低了圖像的空間分辨率。
注意,對于一個經過抖動方法處理的圖像,其尺寸可能太大,比如使用4×4矩陣替代每個像素點,會使圖像變為原來的16倍。利用“有序抖動”的方法可以解決這個問題。假設我們用一個更大的4×4的抖動矩陣,如
然後假設我們把這個抖動矩陣在同一時刻移動到圖像在水準和垂直方向的四個像素上(這裡的圖像值已經被降低到0~16這個區間中),如果某個像素的亮度值大于覆寫它的矩陣元素的編号,則填塗在列印機的相應元素輸出位。圖3.4a展示了Lena的灰階圖。有序抖動版本在圖3.4b中顯示。其中,Lena右眼的詳細情況在3.4c中顯示。
一個使用n×n抖動矩陣的用于有序抖動的算法如下:
Foley等[2]對有序抖動進行了更詳細的讨論。
3.1.3 圖像資料類型
本節介紹圖形和圖像檔案格式的一些最常見的資料類型:24位色和8位色。然後我們将讨論檔案格式。一些檔案格式隻能用于特殊的硬體和作業系統平台(如Linux中的X-windows),而另一些是平台無關(platform-independent)或者跨平台(cross-platform)的檔案格式。即使有些格式不是跨平台的,但轉換程式能識别這些格式并将其轉換成其他格式。
由于圖像檔案需要較大的存儲空間,是以大多數圖像格式都結合了某種壓縮技術。壓縮技術可劃分為無損(lossless)壓縮和有損(lossy)壓縮。我們将在第7~14章學習各種圖像、視訊和音頻壓縮技術。
3.1.4 24位彩色圖像
在一個24位彩色圖像中,每個像素用三個位元組表示,通常表示為RGB。因為每個值的範圍是0~255,這種格式支援256×256×256(總共16777216)種可能的顔色組合。然而,這種靈活性會導緻存儲問題。例如,一幅640×480的24位彩色圖像如果不經壓縮,需要921.6KB的存儲空間。
需要注意的一個重點是:許多24位彩色圖像通常存儲為32位圖像,每個像素多餘的資料位元組存儲一個α(alpha)值來表示特殊資訊。(詳見文獻[2],使用α通道在圖形圖像中合成一些重疊物體,簡單地用作一個透明标簽)。
圖3.5顯示了圖像forestfire.bmp,一幅用Microsoft Windows BMP格式(本章後面部分讨論)顯示的24位圖像。這幅圖像的R、G、B通道的灰階圖分别如圖中顯示。每個顔色通道的0~255的位元組值表示亮度,我們就能夠用每種顔色分别顯示灰階圖。
3.1.5 高位深度圖像
在圖像格式中,為了最大程度地忠于實際情況,一些格式是不壓縮的。例如,在醫學領域,患者的肝髒圖像需要能夠精确地展示各種細節資訊。
在一些特殊的場景中,需要識别更多的圖像資訊。這些資訊通常通過特殊的攝像頭獲得,可以檢視超過三種顔色(即RGB)。比如,利用使用不可見光(如紅外線、紫外線)的安全錄影機擷取皮膚的醫學圖像,通過利用額外的顔色資訊,這些圖像可以更好地診斷皮膚疾病,如皮膚癌。另外,衛星影像使用高位深度圖像,擷取的資訊用于訓示莊稼生長的類型。将相機送入高空或太空可以幫助人們擷取更多的資訊,但可能我們現在還無法充分利用這些資訊。
這類圖像稱為多光譜(超過三種顔色)或高光譜(許多圖像平面,比如衛星影像的224色)。
在本章中,我們主要介紹灰階圖和RGB彩色圖。
3.1.6 8位彩色圖像
如果空間相關(實際基本如此),通過量化顔色資訊就可以得到足夠精确的彩色圖像。許多系統隻能利用8位顔色資訊(也稱作256色)來生成螢幕圖像,即使有些系統具備能真正使用24位顔色資訊的硬體裝置,但由于向後相容的特性,我們必須了解8位彩色圖像檔案。我們将會發現有些技巧隻适用于這類圖像。
8位彩色圖像檔案使用了查找表(lookup table)來存儲顔色資訊。基本上,圖像存儲的不是顔色而僅僅是位元組的集合,每個位元組是指向一個表的索引。該表表項具有三位元組值,指明了像素(帶有查找表索引)的24位顔色。從某種程度上講,它有點像小孩的按序号畫圖的繪畫冊,數字1可能代表橙色,數字2代表綠色等——真正的顔色集不一定是這個模式。
在一幅圖中使用哪些顔色是具有最佳表現力和最有意義的?如果一幅圖像描繪的是日落場景,那麼合理的做法是精确地表現紅色、存儲少量的綠色。
假設一幅24位圖像中所有的顔色都放在一個256×256×256的格子集裡,同時還要在格子中存儲每種顔色對應的像素數目。比如,如果23個像素具有RGB值(45,200,91),那麼把23存儲在一個三維數組中,元素下标值為[45,200,91]。這種資料結構稱為顔色直方圖(color histogram)。(詳見文獻[3,4])。顔色直方圖是在圖像進行中進行圖像轉換和操作的有用工具。
圖3.6顯示了forestfire.bmp中像素的RGB值的三維直方圖。直方圖有16×16×16個小格,并用亮度和僞彩色的形式顯示了每個小格中的像素數目。我們能夠看到一些顔色資訊的重要聚類,對應forestfire圖像的紅色、綠色、黃色等。這樣的聚類方法讓我們能夠選出最重要的256種顔色。
基本上,三維直方圖小格中的大資料量能夠由分割合并(split-and-merge)算法解決,以便選取最好的256種顔色。圖3.7顯示了作為結果的GIF格式(本章後面部分讨論)的8位圖像。注意,很難區分圖3.5a顯示的24位圖像和圖3.7顯示的8位圖像的差别。不過這并不符合所有情況,比如在醫學圖像上:對用于雷射外科手術的大腦圖像,你是否滿足于圖像僅僅是“合理精确”呢?可能不會吧,這就是為什麼要在醫學應用中考慮使用64位圖像的原因。
請注意,8位圖像比24位圖像大大節省空間,一幅640×480的8位彩色圖像隻需要300KB的容量,而在沒有任何壓縮的情況下,一幅彩色圖像需要921.6KB的空間。
3.1.7 顔色查找表
回顧一下,在8位彩色圖像中,僅僅是為每個像素存儲下标或編号值。那麼,如果一個像素存儲的值是25,就表示顔色查找表(LookingUp Table,LUT)中的第25行。因為圖像使用二維數組值顯示,故它們通常按照行列順序存儲為一長串的值。對一幅8位圖像而言,圖像檔案可以在檔案頭資訊中存儲每個下标對應的8位RGB值。圖3.8顯示了這種方法。顔色查找表通常稱為調色闆(palette)。
一個顔色選擇器(color picker)由比較大的顔色塊(或者說是斷斷續續的顔色空間)的數組組成,這樣滑鼠點選就能選中指定的顔色。實際上,一個顔色選擇器顯示其下标值為0~255的顔色闆顔色。圖3.9為顔色選擇器的示意圖。如果使用者選擇了下标值為2的顔色塊,那麼該顔色為青色,RGB值為(0,255,255)。
通過修改顔色表就可能制作簡單的動畫,這稱為色彩循環(color cycling)或調色闆動畫(palette animation)。因為顔色表更新非常快,這樣會獲得簡單但令人滿意的效果,比如帶顔色的文字跑馬燈。因為更改小面闆資料較為簡單,這個技巧可能隻适用于8位彩色圖像。
抖動技術同樣可以用來進行彩色列印。每個顔色通道用1位,同時用RGB點把顔色隔開。或者,如果列印機或者螢幕隻能列印有限數量的顔色,比如用8位而不是24位,那麼即使在顔色查找表中無法找到的顔色也是可以列印的。通過平均相鄰像素點的亮度,顯示的顔色分辨率可以明顯增加而不用降低空間分辨率。這樣我們就能通過采用空間混色來欺騙眼睛,讓它感覺能看到不可獲得的顔色。圖3.10a顯示了一幅24位彩色Lena圖像;圖3.10b顯示了同一幅圖通過抖動技術減少到5位的情況;圖3.10c顯示了左眼的細節。
怎樣設計顔色查找表
在3.1.6節中,我們簡單讨論了聚類(clustering)的思想,用于從一幅24位彩色圖像中産生最重要的256種顔色。然而一般來說,聚類是昂貴又費時的辦法,但我們的确需要設計顔色查找表,那麼應該怎麼做呢?
最直接的辦法是在每一維把RGB立方體分成大小相等的塊,然後将每個結果立方體中央的顔色作為顔色查找表的表項,隻需要把RGB從0~255區間變為合适的區間就可以産生8位編号。
比起B,人們對R、G更敏感,是以我們可以分别将R值和G值的範圍從0~255縮小到3位(0~7),而B值的範圍縮小到2位(0~3),總共8位。為了縮小R值和G值區間,我們隻需要用322568除R或是G位元組值,并截取結果的小數部分。這樣圖像中每個像素用8位下标代替,而顔色查找表提供了24位顔色。
然而,應用這種簡單方案的後果是圖像中會出現邊緣效果。這是因為RGB中的輕微變化會導緻移動到一個新的編号,進而産生邊緣,這看起來很不舒服。
解決這種色彩減退問題的一個簡單方法是采用中值區分算法(median-cutalgorithm),一些其他方法也具有同樣或更好的效果。這種方法是從計算機圖形學[5]衍生而來的,這裡我們隻介紹一個精簡的版本。這個方法是自适應分區方案的一種,它試圖表達最多的位、具有最強的識别能力,而且顔色也是最聚集的。
該算法思想是将R位元組值排序,并找到其中值。然後,比中值小的值标記為0位,比中值大的值标記為1位。中值是一半像素值比其小、一半像素值比其大的點。
假設我們把一些蘋果畫成圖,大多數像素都是紅色的,那麼R的中值可能落在0~255範圍内的較高部分。下一步,我們僅僅考慮第一步後被标記為0的像素,并将它們的G值排序。接着,我們用另一位标記圖像像素,0标記比中值小的像素,1标記比中值大的像素。然後,把同樣的規則用于第一步後被标記為1的像素,這樣我們給所有的像素點加上了2位标簽。
繼續在B分量上執行上述步驟,我們就得到了3位的方案。重複前面所有步驟,得到6位方案,再重複R、G步驟,得到了8位方案。這些位形成了像素的8位顔色下标值,相應的24位顔色是最終小顔色立方體的中心。
可以看到,事實上這種方案關注那些最需要與大量顔色位差別的位。利用顯示0~255數目的直方圖,我們可以很容易找到中值。圖3.11顯示了圖forestfire.bmp的R位元組值的直方圖以及這些值的中值,用豎線表示。
用相應的顔色查找表中的24位顔色替代每個像素得到的24位彩色圖像僅是原圖的一個近似。不過,上述算法的意義是在最需要的地方(最需要注意的小的色差)賦予了最大的識别能力。還需要提到的是,有一些方法可用來把近似誤差平均到每個像素上,這具有平滑8位近似圖像的效果。
中值區分算法的更精确的版本如下所示:
1) 找出最小的方形區域,它包含圖像中的所有顔色。
2) 沿方形區域的長邊排序它所包含的顔色。
3) 在排序連結清單的中間處把該方形區域劃分為兩個區域。
4) 重複上面步驟2和3,直到初始的顔色空間被分割成256個區域為止。
5) 對每個方形區域,把該方形區域中R、G、B的平均值作為其代表(中心)顔色。
6) 根據一個像素的RGB值與每個方形區域的中心值的歐氏距離,給每個像素配置設定一個代表顔色。在指向代表顔色的查找表中(其中,每種代表顔色是24位的,R、G、B均為8位)用編号替代像素。
這樣,我們就有了一個256行的表,每行含有3個8位值。行的下标是查找表的編号,這些下标正是存儲在新的量化顔色(調色闆)圖像中的像素值。
3.2 常見的檔案格式
下面介紹一些流行的檔案格式。其中最簡單的一種是8位GIF格式,我們學習它是因為它容易了解,而且它與網際網路和HTML标記語言有着曆史淵源,它是能被網絡浏覽器識别的第一種圖像類型。然而,目前最重要和常用的檔案格式是JPEG,我們将在第9章中詳細介紹它。
3.2.1 GIF
圖形交換格式(Graphics Interchange Format,GIF)是由UNISYS公司和Compuserve公司開發的,最初通過數據機在電話線上傳送圖形圖像。GIF标準采用了Lempel-Ziv-Welch算法(一種壓縮格式,詳見第7章),但對圖像掃描線資料包稍加修改,以有效地使用像素的行分組。
GIF标準僅适用于8位(256)彩色圖像。因為這能夠生成可接受的顔色,它最适合用于具有少量獨特色彩的圖像(如圖形和繪畫)。
GIF圖像格式具有一些有趣的特點,盡管它在很多地方已經被取代了。該标準支援隔行掃描——通過套色(four-pass)顯示方法處理,相隔的像素可以連續顯示。
事實上,GIF有兩個版本,最初的規範是GIF87a。後一個版本GIF89a通過資料中的圖形控制擴充(Graphics Control Extension)塊支援簡單的動畫。它對延時、透明索引等提供了簡單的控制。像Corel Draw這樣的軟體支援對GIF圖像的通路和修改。
GIF87檔案格式的一些細節是有意義的,因為許多這樣的格式與其有共同之處;不過與這個“簡單”标準相比,已經變得複雜很多。對于标準規範而言,常用的檔案格式如圖3.12所示。其中簽名是6個位元組:GIF87a;螢幕描述符是7位元組标志位。一個GIF87檔案可以包含不止一種圖像定義,通常與螢幕中不同的部分比對。是以每個圖像可以有自己的顔色查找表,即局部色圖(Local Color Map),用于把8位映射成24位RGB值。然而,局部色圖不是必需的,可以定義一個全局的色圖替代它。
螢幕描述符包含了屬于檔案中每個圖像的屬性。根據GIF87标準,如圖3.13所示。螢幕寬度在前兩個位元組中給出。因為一些機器可能會轉換MSB/LSB(最高有效位元組/最低有效位元組)順序,這個順序就被指定了。螢幕高度在後兩個位元組給出。如果沒有給出全局色圖,則将第5個位元組的“m”置0。顔色分辨率“cr”為3位,範圍從0~7。因為這是一個老的标準,通常在一些低端硬體上操作,“cr”需要很高的顔色分辨率。
下一位顯示為0,在該标準中沒有用到。“pixel”為另外3位,指明圖像檔案中每個像素的位數。但是通常“cr”等于“pixel”,故“pixel”不是必需的。第6位元組給出背景顔色在顔色表中的下标,第7位元組填0。在現在的用法中,使用小的顔色分辨率比較好,因為我們可能會對非常低端的裝置感興趣,比如支援上網功能的手表。
可以用一個簡單的方法建立色圖(color map),如圖3.14所示。然而,正如螢幕描述符指出的,表的真實長度等于2pixel+1。
檔案中的每幅圖像都有自己的圖像描述符,在圖3.15中定義。有趣的是,标準的定制者們為了将來的擴充,忽略了一幅圖像末尾和另一幅圖像開始的一些位元組,用逗号來識别。這樣,在将來需要擴充時,就非常容易做到向後相容。
如果設定了局部圖像描述符中的隔行位,則圖像的行以套色順序顯示,如圖3.16所示。這裡,第一個通道顯示第0行和第8行,第二個通道顯示第4行和第12行,以此類推。這樣,當一個Web浏覽器顯示圖像時,就能讓圖像概略迅速顯示,進而再詳細展示細節。下面的JPEG标準具有相似的顯示方式,這種方式稱為漸進式方式。
真實光栅資料(actual raster data)本身在存儲前先用LZW壓縮方案(詳見第7章)壓縮。
為了将來的使用,GIF87标準也設定了擴充塊該怎樣定義。即使在GIF87中,也可以實作簡單的動畫,但是沒有定義圖像間的延遲。多幅圖像之間隻能被覆寫,而不會清屏。
GIF89引進了許多擴充塊定義,特别是那些和動畫相關的定義,如透明和圖像間延遲。GIF89中引入的一個相當有用的特性是排序顔色表。最重要的顔色率先出現,這樣,如果解碼器隻能使用較少的顔色,則最重要的顔色就會被選中。也就是說,僅使用顔色查找表中的一部分,72鄰近的顔色盡可能映射到可利用的顔色。
通過看一個GIF圖像,就可了解檔案頭是怎樣工作的。圖3.7是一幅8位彩色GIF圖像。為了了解檔案頭,我們可以使用UNIX/Linux/Max OS作業系統中比較常用的指令:od(octal dump)。在UNIX下,我們使用指令:
這樣,我們就可以看到前32個位元組被解釋為如下字元:
為了解釋檔案頭的剩餘部分(GIF87a之後的部分),我們使用十六進制:
得到結果:
其中,簽名後的d002和bc01是螢幕寬度和高度。它們以低位位元組在前的順序表示,是以對這個檔案,螢幕寬度用十六進制表示是0+13×16+2×162=720,螢幕高度是11×16+12+1×162=444。f7(十進制的247)為螢幕描述符的第5個位元組,之後是背景色索引00和分隔符00。辨別符f7以位形式表示為1,111,0,111。換句話說,采用全局色圖、8位顔色分辨率、0分隔符、8位像素資料。
3.2.2 JPEG
目前最重要的圖像壓縮标準是JPEG[6]。該标準由國際标準化組織(International Organization for Standardization,ISO)的一個工作組制定,該工作組的一個非正式稱呼為聯合圖像專家組(Joint Photographic Experts Group),JPEG也是以得名。我們将在第9章詳細學習JPEG,不過這裡先介紹它的一些主要特點。
JPEG利用了人類視覺系統一些特定的局限,進而獲得很高的壓縮率。眼腦系統看不到一些極其精準的細節。如果一些像素發生了許多變化,我們稱圖像的那個部分具有高空間頻率,即在(x,y)空間發生了許多變化。和灰階圖相比,這個局限對于彩色圖更為明顯。是以,JPEG中的顔色資訊被大量丢掉并且圖像中的小塊用空間頻率域(u,v)來表現,而不是(x,y),即從低到高對x和y的改變速度進行估計。通過将這些速度的系數或權值進行分組,可以形成一個新的“圖像”。
人們偏好緩慢變化的權值。這裡有一個簡單的方法:值被大的整數除并截尾,這樣小的值就變成了零,然後采用能夠有效表示一長串0的方案。瞧!圖像就被極大地壓縮了。
因為在除和截斷步驟中扔掉了許多資訊,是以這種壓縮方案是有損的(盡管也有無損的方式)。而且,因為讓使用者直接選擇使用多大的分母,也就是決定了将丢失多少資訊,JPEG允許使用者設定需要的品質等級,或者說是壓縮率(輸入除以輸出)。
作為例子,圖3.17展示了forestfire圖像,品質因數Q=10(通常預設的品質因數為Q=75)。
這幅圖僅是原圖大小的1.5%。在壓縮時,一幅Q=75的JPEG圖像的大小為原圖的5.6%,而這幅圖的GIF版本大小壓縮到原圖的23.0%。
3.2.3 PNG
随着網際網路的流行,研究人員花費大量的精力研究更多與系統無關的圖像格式。這就是便攜式網絡圖形(Portable Network Graphics,PNG)。這個标準有望取代GIF标準并做了重要擴充。提出一個新标準的原因部分在于UNISYS和Compuserve在LZW壓縮方法上的專利。(有趣的是,該專利僅僅有壓縮,而沒有解壓縮,這也是為什麼UNIX的gunzip功能可以将LZW壓縮檔案解壓縮的原因)。
PNG的獨特和優勢之處是最多可支援48位的色彩資訊——這是非常大的進步。檔案可能還包含用于正确顯示彩色圖像的伽馬(gamma)校正資訊(見4.1.6節)以及用于透明控制的Alpha通道資訊(最多16位)。與GIF圖像中基于行隔行掃描的逐行顯示不同,PNG在7個通道上對圖像的每8×8塊在二維空間内逐漸顯示一些像素。相對于GIF,它能更好地支援有損和無損壓縮。多數網頁浏覽器和圖像軟體都支援PNG。
3.2.4 TIFF
标記圖像檔案格式(Tagged Image File Format,TIFF)是另一種常用的檔案格式。它由Aldus公司在20世紀80年代開發,後來受到Microsoft的支援。它支援附帶額外資訊(稱為标記),這提供了極大的靈活性。最重要的标記就是格式表示(format signifier),即在存儲圖像時用了哪些壓縮類型等。比如,TIFF可以存儲不同的圖像類型,包括1位、灰階、8位、24位RGB等。TIFF最初是無損格式。但是新的标記能讓你選擇使用JPEG、JBIG,甚至JPEG 2000格式壓縮。因為TIFF不像JPEG那樣是使用者可控的,是以它不具有後者的主要優點。TIFF檔案普遍用于存儲未壓縮的資料。TIFF檔案分為幾部分,每部分可以存儲位圖圖像、向量式或基于圖元的圖像(見下面的補充說明)或其他類型的資料。每部分的資料類型都在它的标簽中指定。
3.2.5 Windows BMP
位圖(BitMap,BMP)是Microsoft Windows主要的系統标準圖形檔案格式。它使用光栅圖形技術。BMP支援很多像素格式,包括索引顔色(每像素8位)和16、24、32位彩色圖像。它利用行程編碼(Run-Length Encoding,RLE)壓縮(詳見第7章),并且可以有效地壓縮24位彩色圖像(利用24位RLE算法)。位圖圖像也可以不壓縮存儲。需要指明的是,16位和32位彩色圖像(帶有α通道)總是不壓縮的。
3.2.6 Windows WMF
Windows元檔案(Windows MetaFile,WMF)是用于Microsoft Windows操作環境的本地向量檔案格式。WMF檔案實際上由一系列圖形裝置接口(Graphics Device Interface,GDI)函數調用組成,它對Windows環境而言也是本地的。當“播放”一個WMF檔案時(通常使用Windows的PlayMetaFile()函數),以便呈現出所描述的圖形。WMF檔案表面上是裝置無關和大小無限制的。增強型圖元檔案格式和擴充(Enhanced Metafile Format Plus Extensions,EMF+)格式是與裝置無關的。
3.2.7 Netpbm Format
PPM(Portable PixelMap)、PGM(Portable GrayMap)和PBM(Portable BitMap)屬于開源項目Netpbm Format。這些格式在Linux/UNIX環境中很常見。它們也稱為PNM或PAM(Portable AnyMap)。這些都是ASCII檔案或原始二進制檔案,并且帶有ASCII頭。它們很簡單且可以友善地用于跨平台應用。很多軟體都支援它們,比如X-windows的xv、Linux系統上的GIMP,也可以用于Mac OS以及Windows。
3.2.8 EXIF
可交換圖像檔案(Exchangeable Image File,EXIF)是用于數位相機的圖像格式。它使記錄的圖像中繼資料(曝光、光源/閃光、白平衡、場景類型等)按照圖像标準交換。一系列标簽(比TIFF标簽多很多)使高品質的列印更容易,因為關于相機和照片拍攝場景的資訊很容易儲存并使用,比如列印機的色彩校正算法。在大多數數位相機中EXIF格式附加在JPEG軟體中。它還包括音頻的檔案格式規範,附加在數字圖像中。
3.2.9 PS和PDF
PostScript是一種用于排版的重要語言,許多高端的列印機有内置的PostScript解釋器,PostScript是基于向量的(而不是基于像素的)圖檔語言,其頁元素本質上用向量定義。有了以這種方式定義的字型,PostScript包含文本,也包含向量/結構化圖形,位映射圖像也可以包含在輸出圖像中。封裝的PostScript檔案加上一些資訊就可以将PostScript檔案包含在另一個文檔中。
一些流行的圖形程式(如Illustrator和FreeHand)都會用到PostScript,然而PostScript頁描述語言本身并沒有提供壓縮。實際上,PostScript檔案就是用ASCII儲存的。是以,檔案通常都很大,從理論上說,這種檔案通常隻有在利用UNIX的工具(如compress或者是gzip)壓縮之後才能夠使用。
是以,另一種文本+圖的語言已經開始取代PostScript,Adobe System公司在它的便攜式文檔格式(Portable Document Format,PDF)中包含了LZW(見第7章)壓縮。其結果是,不包含圖像的PDF檔案擁有幾乎相同的壓縮比(2∶1或者3∶1),就像用其他基于LZW壓縮工具的檔案一樣,比如UNIX的compress或gzip、基于PC的winzip(pkzip的變體)或WinRAR。對于包含圖像的檔案,PDF通過對圖像内容使用單獨的JPEG壓縮(與建立原始圖和壓縮版本的工具有關),可以獲得更高的壓縮比。Adobe Acrobat PDF閱讀器也可以用于閱讀建構為超連結元素的文檔,這種文檔提供可點選的内容和友善的樹狀結構的總結的連結圖表。
對計算機科學與工程的學生來說,了解PostScript這個名字出現的原因是很有意思的,因為這個語言基于堆棧結構的字尾表示法,即運算符在操作數之後的形式。基于圖元的圖像在PostScript上的特征意味着帶有清晰線條的圖表應該可以在任何輸出裝置上輸出,更重要的是可以産生任何縮放級别的輸出(低分辨率的列印機也應該産生低分辨率的輸出)。PostScript引擎輸出裝置(比如螢幕)使行程指令盡可能整潔。比如,我們運作指令100 200 moveto,PostScript翻譯程式會把x和y的位置放入堆棧;如果我們繼續輸入250 75 lineto和stroke,會把一行寫入下一個點。
3.2.10 PTM
多項式紋理映射(Polynomial Texture Mapping,PTM)是一項存儲相機場景表示的技術,其中包含了一系列在不同光照下拍攝的照片的資訊,每個都有相同的光譜,并放不同的場景位置[7]。
假設我們已經得到了通過定位相機拍攝的一個場景的n幅圖像,但是光照方向ei=(ui,vi,wi)T不同用。比如,可以使用40或50個半球形燈架,每個放在穹頂頂端。PTM的一部分目的是為了發現被拍攝對象的表面性質,這已經用在了拍攝博物館文物與繪畫方面。PTM的主要任務是插入照明方向,以便生成之前沒有看到的新圖像。通過将多重插值系數修改為整數的方法來保持PTM圖像集合的檔案大小在較小的水準。
圖3.18a展示了輸入圖像的标準集合,這裡顯示了50個輸入圖像。圖3.18b展示了插值圖像,其中不包含光照方向[8]:其中光照系數為θ=42.6°,代表垂直于該軸平面的x,y角。
PTM的工作原理是:假定一個生成亮度的多項式模型L=R+G+B(或R、G、B分别計算),并通過亮度方向ei(其中i=1,…,n)來計算回歸模型Li[7]。徑向基函數(RBF)多餘的插值用于非光滑現象插值,比如陰影和鏡面反射[8]。
3.3 練習
1.簡要解釋為什麼我們需要少于24位的顔色,而且這樣為什麼會帶來麻煩?一般而言,我們需要怎麼做才能把24位顔色值轉換為8位顔色值?
2.假設我們需要量化8位的灰階圖像到僅僅2位精度。最簡單的辦法是什麼?原圖像中位元組值的哪個範圍映射到哪個量化值?
3.假設我們有5位灰階圖像。我們需要多大的抖動矩陣來在1位列印機上顯示這幅圖?
4.假設對一幅彩色圖像的每一個像素,我們有24位可以利用。然而我們發現,比起藍色(B)來,人們對紅色和綠色更為敏感,實際上,人們對紅色(R)和綠色(G)的敏感度是藍色的1.5倍。我們怎樣才能更好地使用可以利用的位?
5.在你的工作中,你決定通過用更多的磁盤空間來存儲公司的灰階圖像,以給你的老闆留下深刻的印象。你喜歡用RGB,每個像素48位,而不是每個像素使用8位。那麼,你怎樣用新的格式存儲原來的灰階圖像以使它們在視覺上看起來和原來一樣呢?
6.如圖3.19a所示的8位灰階圖,從左至右從0到255線性陰影,如圖3.19b所示。這幅圖像的大小是100×100。對于最重要的位平面,請畫一幅圖像顯示1和0,這裡有多少1?對于次重要的位平面,請畫一幅圖像顯示1和0,這裡有多少1?
7.對于顔色查找表的問題,在一幅圖像上試試中值區分算法。簡要解釋該算法:若用在一幅紅蘋果圖像上,在紅色中,為什麼把更多的顔色等級放在那些需要24位彩色圖像的地方?
8.關于無序抖動,一本标準的圖形教材[2]講到:“甚至可以用更大的模式,但是空間分辨率與亮度分辨率的折中受到我們視覺敏銳程度(普通光中大約1′的弧)的限制。”
(a) 這句話是什麼意思?
(b) 如果拿着一張紙站在一英尺開外的地方,點之間的大緻線性距離是多少?(提示:1′的弧是1°角的1/60。一個圓上的弧長等于角(用弧度)乘以半徑。)我們能夠看到用300dpi列印機列印出的點的間隙嗎?
9.寫一個算法(僞代碼)來計算RGB資料的顔色直方圖。
10.較長的描述怎樣使用單一的圖像和一些顔色查找表來實作簡單的動畫——一個旋轉色輪,其中一個序列的四個快照會重複出現,輪子每次旋轉90°。