圖像的構(gòu)成、創(chuàng)建、讀取、訪問

lena.jpg

前言

我是人工智障,一名程序猿。做過嵌入式、爬蟲,目前在自學(xué)計算機視覺 。注冊 「命運探知之魔眼」(名字取自影視作品「命運石之門」)這個公號已有些日子,真正有心將它運營起來是看到朋友狗哥運營它的公號「一個優(yōu)秀的廢人」之后。注冊這個號的初衷是分享我的 計算機視覺 學(xué)習(xí)筆記,希望更多的人加入我的行業(yè),杜撰一下希特勒的話:「我們每寫一行代碼,都在改變著世界的版圖」。

圖像是什么

人類看到圖像的原理(引用維基百科):

物體發(fā)來的光線經(jīng)過眼的折光系統(tǒng),一般會在視網(wǎng)膜上形成像,被感光細(xì)胞感到。
感光細(xì)胞受刺激后將其刺激的形態(tài)傳遞到大腦,大腦的不同部分平行工作產(chǎn)生圖像的概念。

數(shù)字圖像的形成原理與人類解析到圖像的原理相似,數(shù)字圖像是連續(xù)的光信號經(jīng)過傳感器的采樣在空間域上的表達。一張圖像是由一個包含若干個像素點的矩形框組成的,試著把一張圖在“畫圖”軟件中放大會有更直觀的感受,下面是lena圖放大后的效果。

lena放大圖

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

圖像的顏色

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

灰度值

人類看到彩色也是需要3種視錐細(xì)胞,分別感受紅綠藍(lán)不同的顏色,缺失某種細(xì)胞則會造成不同的色盲。要表示彩色像素,先回憶初中物理學(xué)的三原色,紅綠藍(lán)(RGB),飽和的紅綠藍(lán)三種顏色疊加起來就是白色,假如其中一種顏色不那么“飽和”則可以表示其他的顏色,調(diào)節(jié)三種顏色的比例則可以表示我們常看到的24位色。灰度值的顏色空間在幾何上可以用一根直線表示,而RGB彩色空間在幾何上則對應(yīng)了一個立方體,如下圖:

RGB

因此,要表示彩色值,我們需要3個維度,也就是3個圖像通道,每個像素值用3個數(shù)字表示,如(255,255,255)表示白色,(255,0,0)表示紅色,(255,255,0)表示黃色。

圖像的坐標(biāo)系

像素在圖像上的排布使用左手坐標(biāo)系,原點在左上角,如下圖:

圖像坐標(biāo)系

代碼

在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()

運行結(jié)果:


運行結(jié)果

PS:對于上面的代碼,如果從第一行開始就看不懂,建議先補習(xí) Python 基礎(chǔ),參考這個公號「一個優(yōu)秀的廢人」。

如果還是有點感覺的,請繼續(xù)往下看。

首先

import cv2

是導(dǎo)入 OpenCV 庫,我們要學(xué)的所有函數(shù)都在這個庫里面。

import numpy as np

numpy 是一個科學(xué)計算庫,如果你是電子相關(guān)專業(yè)的學(xué)生,應(yīng)該有學(xué)過 Matlab ,numpy的功能就跟 Matlab 類似,能夠表達矩陣和矩陣相關(guān)的操作,圖像的數(shù)據(jù)結(jié)構(gòu)就是 numpy.array 。

main 函數(shù)里面的第一行,我們從磁盤上讀取了一幅圖 lena.jpg 。

img = cv2.imread('lena.jpg')
cv2.imread 參數(shù):

cv2.imread (圖像路徑,格式標(biāo)志),
其中第一個參數(shù)是必須的,是相對于工作路徑的圖片的地址;
第二個參數(shù)有三種可以取的值,分別是:

  • cv2.IMREAD_COLOR
  • cv2.IMREAD_GRAYSCALE
  • cv2.IMREAD_UNCHANGED

默認(rèn)不填就是 cv2.IMREAD_COLOR ,也就是把圖片當(dāng)作彩圖讀入。
cv2.IMREAD_GRAYSCALE 也就是把圖片讀入后轉(zhuǎn)換成灰度圖,這個值也等于0,使用的時候可以直接寫 cv2.imread(img_path, 0)。
cv2.IMREAD_UNCHANGED 是原封不動的讀取,圖片該是怎樣就怎樣讀。

cv2.imread 返回值:

cv2.imread 的返回值是一個 numpy.array 結(jié)構(gòu),相當(dāng)于一個矩陣,矩陣的維度信息、具體每一個數(shù)據(jù)都能獲取到。

注意:如果圖像讀取失敗,例如傳入的路徑不對或者圖片損壞,返回值是 None ,如果需要健壯的處理請務(wù)必加上這個判斷。
numpy.array:

img.shape 就是獲取維度,對應(yīng)的是 Python 的元組( tuple )在這里,因為是彩色圖,所以 tuple 有 3 個元素
,如果是灰度圖,則只有兩個元素,您可以自行測試。在實際使用中如果得到了一幅不知道是彩圖還是灰度圖的 img ,就可以用 if len(img.shape) == 3 這樣的方法去判斷。

看上面的運行結(jié)果,輸出的 img.shape 是 (512L, 512L, 3L),這個 L 表示長整型,可以把它忽略。我們就說這是一幅 512x512x3 大小的圖,其中第一個 512 表示圖像的高度,第二個 512 表示圖像的寬度, 第三個 3 就是前面說的表示它是彩色圖,也就是通常所說的通道數(shù)。

3 個通道是因為上面講圖像的顏色的時候,我們說了彩色圖的一個像素值要用 3 個數(shù)字表示,所以再看回運行結(jié)果的第二行,打印 img[0,0] 的時候就輸出了一個 3 元素的list —— [128 138 255],其中第一個通道是對應(yīng)的藍(lán)色通道,第二個通道是綠色,第三個是紅色,也就是通常所說的 BGR 排列。

numpy.arra y與 Matlab 中的矩陣很相似,也支持多個數(shù)據(jù)同時訪問,如 img[0, :] 可以表示圖像的第一行所有像素、img[..., 0] 可以表示圖像的第一個通道所有像素。

圖像的顯示

如果要顯示上面的圖像,就要使用 cv2.imshow 函數(shù),在上面貼的代碼中沒有寫,可以自行測試。

cv2.imshow:

接收兩個參數(shù):(窗口名,圖像)
如 cv2.imshow('LENA',img) 就會顯示一個名稱是 LENA 的窗口,內(nèi)容是 lena 圖。

如果急著進行這一步就運行的話可能會看到有個一閃而過的窗口,然后程序就結(jié)束了,因為窗口必須要有阻塞才會顯示,阻塞的方法我們可以讓程序等待,這就用到了 cv2.waitKey 函數(shù)。

cv2.waitKey:

接收 1 個參數(shù): 等待時間(單位是毫秒(ms),1000 ms = 1 s)。
返回值是用戶按下的鍵值,我通常的用法是:

cv2.imshow('LENA', img)
if cv2.waitKey(0) == ord('q'):
    print 'EXIT'
    return

這里我傳入的參數(shù)是 0,表示一直等待,直到我按下 Q 鍵讓它退出。

顯示出來的效果是這樣的:


顯示效果

后語

我不是大神,不是什么牛人,于 計算機視覺 領(lǐng)域來說,我是菜雞,但誰剛開始接觸一個領(lǐng)域的時候不是菜雞呢。 寫這個號的目的是為了記錄我自學(xué) 計算機視覺 的筆記。

如果本文對你哪怕有一丁點幫助請右下角點贊,否則忽略就好。平時工作也是在做計算機視覺,希望大家多多指教。

我一直認(rèn)為學(xué)習(xí)不能有所見即所得的想法,一看就會,一做就錯。千萬不要偷懶,所謂大神都是一個一個坑踩過來的。

如果有朋友想加快學(xué)習(xí)進度的話,可以直接學(xué)習(xí) OpenCV 自帶的教程

對于我的文章有什么紕漏或者疑問的,歡迎下方留言。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容