數字圖像是連續的光信號經過傳感器的採樣在空間域上的表達。一張圖像是由一個包含若干個像素點的矩形框組成的,試着把一張圖在“畫圖”軟件中放大會有更直觀的感受,下面是lena圖放大後的效果。
可以看到圖像是由很多個小格子組成的,每個小格子都只有一種顏色,這是構成圖像的最小單元——像素(pixel)。不同的像素值代表了不同的顏色,像素值的值域一般在0到255(包括)之間,也就是256個整數,因此可以用完整個unsigned char類型的值域,所以像素值一般都是用unsigned char類型表示。
但0-255並不能映射到像上圖所示的彩色,而只是對應黑色到白色之間的灰度值(grayscale),如下圖:
要表示彩色像素,先回憶初中物理學的三原色,紅綠藍(RGB),飽和的紅綠藍三種顏色疊加起來就是白色,假如其中一種顏色不那麼“飽和”則可以表示其他的顏色,調節三種顏色的比例則可以表示我們常看到的24位色。灰度值的顏色空間在幾何上可以用一根直線表示,而RGB彩色空間在幾何上則對應了一個立方體,如下圖:
因此,要表示彩色值,我們需要3個維度,也就是3個圖像通道,每個像素值用3個數字表示,如(255,255,255)表示白色,(255,0,0)表示紅色,(255,255,0)表示黃色。
像素在圖像上的排布使用左手座標系,原點在左上角,如下圖:
在OpenCV的python庫中訪問圖像像素的示例代碼如下:
# coding: utf-8
import cv2
import numpy as np
def main():
# 讀取lena圖
img = cv2.imread('lena.jpg')
# 打印img的維度
print 'img.shape:',img.shape
# 打印img的一個像素值
print 'img[0,0]:',img[0,0]
# 打印img的一個像素的一個通道值
print 'img[0,0,0]:',img[0,0,0]
if __name__ == '__main__':
main()
在OpenCV的Python庫中,圖像是用numpy庫的array結構表示的,你可以理解爲矩陣。img這個numpy.array的第一個維度沿着行方向,第二個維度沿着列方向,第三個維度沿着通道。numpy.array與Matlab中的矩陣很相似,也支持多個數據同時訪問,如img[0, :]可以表示圖像的第一行所有像素、img[…, 0]可以表示圖像的第一個通道所有像素。