【計算機視覺(一)】圖像數據表示

數字圖像是連續的光信號經過傳感器的採樣在空間域上的表達。一張圖像是由一個包含若干個像素點的矩形框組成的,試着把一張圖在“畫圖”軟件中放大會有更直觀的感受,下面是lena圖放大後的效果。

lena放大圖

可以看到圖像是由很多個小格子組成的,每個小格子都只有一種顏色,這是構成圖像的最小單元——像素(pixel)。不同的像素值代表了不同的顏色,像素值的值域一般在0到255(包括)之間,也就是256個整數,因此可以用完整個unsigned char類型的值域,所以像素值一般都是用unsigned char類型表示。

但0-255並不能映射到像上圖所示的彩色,而只是對應黑色到白色之間的灰度值(grayscale),如下圖:

灰度值

要表示彩色像素,先回憶初中物理學的三原色,紅綠藍(RGB),飽和的紅綠藍三種顏色疊加起來就是白色,假如其中一種顏色不那麼“飽和”則可以表示其他的顏色,調節三種顏色的比例則可以表示我們常看到的24位色。灰度值的顏色空間在幾何上可以用一根直線表示,而RGB彩色空間在幾何上則對應了一個立方體,如下圖:

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]可以表示圖像的第一個通道所有像素。

個人簡書:https://www.jianshu.com/u/9dae9c45f4a0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章