數(shù)字圖像是連續(xù)的光信號(hào)經(jīng)過傳感器的采樣在空間域上的表達(dá)仿耽。一張圖像是由一個(gè)包含若干個(gè)像素點(diǎn)的矩形框組成的,試著把一張圖在“畫圖”軟件中放大會(huì)有更直觀的感受各薇,下面是lena圖放大后的效果项贺。
可以看到圖像是由很多個(gè)小格子組成的,每個(gè)小格子都只有一種顏色峭判,這是構(gòu)成圖像的最小單元——像素(pixel)开缎。不同的像素值代表了不同的顏色,像素值的值域一般在0到255(包括)之間林螃,也就是256個(gè)整數(shù)奕删,因此可以用完整個(gè)unsigned char類型的值域,所以像素值一般都是用unsigned char類型表示疗认。
但0-255并不能映射到像上圖所示的彩色完残,而只是對(duì)應(yīng)黑色到白色之間的灰度值(grayscale)伏钠,如下圖:
要表示彩色像素,先回憶初中物理學(xué)的三原色谨设,紅綠藍(lán)(RGB)熟掂,飽和的紅綠藍(lán)三種顏色疊加起來就是白色,假如其中一種顏色不那么“飽和”則可以表示其他的顏色扎拣,調(diào)節(jié)三種顏色的比例則可以表示我們掣岸牵看到的24位色《叮灰度值的顏色空間在幾何上可以用一根直線表示誉券,而RGB彩色空間在幾何上則對(duì)應(yīng)了一個(gè)立方體,如下圖:
因此侣夷,要表示彩色值,我們需要3個(gè)維度仑乌,也就是3個(gè)圖像通道百拓,每個(gè)像素值用3個(gè)數(shù)字表示,如(255,255,255)表示白色晰甚,(255,0,0)表示紅色衙传,(255,255,0)表示黃色。
像素在圖像上的排布使用左手坐標(biāo)系厕九,原點(diǎn)在左上角蓖捶,如下圖:
在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的一個(gè)像素值
print 'img[0,0]:',img[0,0]
# 打印img的一個(gè)像素的一個(gè)通道值
print 'img[0,0,0]:',img[0,0,0]
if __name__ == '__main__':
main()
在OpenCV的Python庫中,圖像是用numpy庫的array結(jié)構(gòu)表示的扁远,你可以理解為矩陣俊鱼。img這個(gè)numpy.array的第一個(gè)維度沿著行方向,第二個(gè)維度沿著列方向畅买,第三個(gè)維度沿著通道并闲。numpy.array與Matlab中的矩陣很相似,也支持多個(gè)數(shù)據(jù)同時(shí)訪問谷羞,如img[0, :]可以表示圖像的第一行所有像素帝火、img[..., 0]可以表示圖像的第一個(gè)通道所有像素。