本文是我們Image Processing 101(圖像處理101)系列教程的一部分。
圖像處理和計算機視覺是計算機科學的熱門趨勢,由於其廣泛的應用和樂觀的發展前景,所以繼續顯示出未來的強勁勢頭。在該系列教程的第一篇文章中,我們將通過查看圖像是什麼以及如何存儲圖像來介紹圖像處理的基礎知識。
數字圖像可以在計算機上顯示和處理,並可根據其特徵分為兩大類:位圖和矢量圖像。
位圖基於通常由數字陣列表示的像素圖案。BMP,PNG,JPG和GIF都是位圖。
矢量圖像具有無限可伸縮性,並且沒有任何像素,因為它們使用數學公式繪製線條和曲線。尺寸為M×N的位圖圖像由M行和N列的有限元組成。每個元素都有一個特定的位置和幅度,代表該位置的信息,如灰度和顏色。這些元素稱為圖像元素或像素。
色彩空間
根據每個像素表示的信息,圖像可以分為二進制圖像,灰度圖像,RGB圖像和索引圖像等。
1. 二進制圖像
在二進制圖像中,像素值由0或1表示。通常,0表示黑色,1表示白色。
2. 灰度圖像
灰度圖像在二值圖像中添加黑色和白色之間的顏色深度以形成灰度圖像。這些圖像通常顯示為從最暗的黑色到最亮的白色的灰度,並且每種顏色深度稱為灰度,通常用L表示。在灰度圖像中,像素可以取0到L-1之間的整數值。
3. RGB圖像
在RGB或彩色圖像中,每個像素的信息需要一個數字數組來表示。所以我們需要一個三維矩陣來表示圖像。自然界中幾乎所有顏色都可以由三種顏色組成:紅色(R),綠色(G)和藍色(B)。因此,每個像素可以由RGB圖像中的紅色/綠色/藍色數組表示。
4. 索引圖像
索引圖像由色圖矩陣組成,該矩陣使用數組中像素值的直接映射到色彩映射值。通過使用相應的值確定圖像中每個像素的顏色。我們在下面會更詳細地討論這個問題。
圖像如何存儲在內存中
x86硬件沒有訪問多維數組元素的尋址模式。當將圖像加載到存儲空間中時,多維對象被轉換為一維數組。通常使用行主要排序或列主要排序。
行主要排序
C / C ++和Python採用行主要排序。它從第一行開始,然後將第二行連接到它的結尾,然後連接第三行,等等。這意味著在行主要佈局中,最後一個索引是最快的變化。在矩陣的情況下,最後一個索引是列。
對於灰度圖像,我們可以使用矩陣來表示每個像素的灰度級。以4 * 4圖像為例。
內存
對於彩色圖像,我們需要多維數組來存儲圖像信息。
列主要排序
在多維數組的行主要佈局中,第一個索引是變化最快的。以下就是一個例子。
圖像A有6個像素:
使用行主要排序,連續的內存地址將按如下方式分配:
使用列主要排序,連續的內存地址將按如下方式分配:
圖像如何存儲在文件中
真彩色(24位)
24位圖像通常使用R,G和B中的每一個的8位。對於三種基色中的每一種,如灰度級,L級可以用於指示存在多少這種顏色分量。例如,對於256級的紅色,0表示沒有紅色,255表示100%紅色。同樣,綠色和藍色可分為256級。每種基色可以用8位二進制數據表示,因此總共3種基色需要24位。
未壓縮的原始BMP文件是使用RGB標準存儲的RGB圖像。
索引顏色
對於高度和寬度為200像素和16種顏色的彩色圖像,每個像素由RGB的三個分量表示。因此,每個像素由3個字節表示,整個圖像為 200×200×3 = 120KB。由於彩色圖像中只有16種顏色,因此可以使用顏色表(16×3二維數組)保存這16種顏色的RGB值。我們將在下面進一步詳細討論。數組中的每個元素都代表一種顏色,由其在數組中的位置索引。圖像像素不包含其顏色的完整規範,但僅包含表中的索引。例如,如果顏色表中的第三個元素是0xAA1111,那麼顏色為0xAA1111的所有像素都可以用“2”表示(顏色表索引下標從0開始)。這樣,每個像素只需要4位(0.5字節),所以整個圖像可以存儲在200×200×0.5 = 20 KB。上面提到的顏色表是調色板,它通常也稱為查找表(LUT)。
GIF是支持索引顏色模式的最具代表性的圖像文件格式。
還有許多其他圖像格式和存儲方式,我們暫時不做詳解了。下一篇中,我們將介紹顏色模型相關內容。
敬請期待~