小強學Python+OpenCV之-1.2影象基礎

weixin_33912246發表於2017-05-19

目標

學完本節,我們將理解:

  1. 影象的基本元素是畫素,什麼是畫素。
  2. 影象的座標系統是怎樣的。
  3. 操作畫素的RGB值
  4. 通過numpy陣列操作影象

1. 什麼是畫素

畫素是組成影象的最小單位。我們可以看下面這張圖:

6103941-cf92d47b8eb993d6.png
Pixel-example.png

我們常常像下面這樣表述一幅影象的大小。
300 x 200大小。這裡的300和200便是指的畫素。一幅300 x 200的影象表示有300*200=6萬個畫素。

通常,畫素的值我們稱之為強度。這裡可能要引入一個概念-“通道”才會比較好理解一點。
而影象通常會用兩種方式表示:灰度影象和彩色影象。

灰度影象指的是,每個畫素的值為一個8位無符號數表示的值,範圍是:0-255.也就是說,灰度影象只是用一個通道來表示畫素的強度。如下面的圖所示:
![Uploading image_coor_594914.png . . .]

6103941-56922f968b2739aa.png
無標題.png

而彩色影象是由三個8位(也有可能是16位,32位等)無符號數表示的值。什麼?我沒聽錯吧。三個數會表示成什麼樣子?沒錯,三個數表示成一個numpy陣列(相當於一維陣列)。三個數分別取不同的值(0-255),就可以表示出總共16777216種顏色。


6103941-7dd3672abc935455.png
RGB_color_solid_cube.png

對於三原色RGB的描述,可參考:RGB color model

座標系統

假設我們有一幅5*5的影象,那麼它的座標是這樣的:

6103941-fdc944071679e154.png
image.png

座標系的原點在影象的左上角,畫素(1,3)表示第1列第3行的畫素(注意,這裡是從0開始索引的)。

操作畫素

我們已經知道了影象的座標系統。那麼,我們來嘗試去對畫素做一些修改,看看會發生什麼。
建立python指令碼檔案pixel_modify.py。加入內容如下:

# 匯入庫
import argparse
import cv2
 
# 構建引數解析
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())
 
# 載入影象並顯示
image = cv2.imread(args["image"])
cv2.imshow("Original", image)

# 修改原點(左上角)畫素值並顯示,為了防止肉眼不好辨別,我們把左上角5*5個畫素值同時作修改
image[0:5, 0:5] = (0, 0, 255)
cv2.imshow("Color1", image)
image[0:5, 0:5] = (0, 255, 0)
cv2.imshow("Color2", image)
image[0:5, 0:5] = (255, 0, 0)
cv2.imshow("Color3", image)

cv2.waitKey(0)

執行:
python pixel_modify.py
可以看到如下圖:

6103941-3eac626879933c3e.png

(0,0,255)得到的是紅色。
(0,255,0)得到的是綠色。
(255,0,0)得到的是藍色。
從這裡,我們可以看到,OpenCV中,對於影象三通道的值儲存順序是:BGR而不是我們習慣的RGB。這一點一定要記住。

提取影象

其實,在上面的程式碼中,我們在修改影象左上角畫素值時,已經用到的numpy的切片功能來實現對於影象的操作。下面我們再做一個實驗,鞏固一下。修改程式碼如下:

# 匯入庫
import argparse
import cv2
 
# 構建引數解析
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())
 
# 載入影象並顯示
image = cv2.imread(args["image"])
cv2.imshow("Original", image)

# 計算影象的中心點
(h, w) = image.shape[:2]
(cX, cY) = (w / 2, h / 2)

# 將影象平均分成四部分並顯示
tl = image[0:cY, 0:cX]
tr = image[0:cY, cX:w]
br = image[cY:h, cX:w]
bl = image[cY:h, 0:cX]
cv2.imshow("Top-Left Corner", tl)
cv2.imshow("Top-Right Corner", tr)
cv2.imshow("Bottom-Right Corner", br)
cv2.imshow("Bottom-Left Corner", bl)

cv2.waitKey(0)

執行指令碼,得到如下顯示:

6103941-a2d5a2e5eb07ee85.png
image.png

OK。至此,我們知道了:

  1. 畫素是組成影象的最小單位,有灰度(單通道)和彩色影象(三通道)的區別。
  2. 影象的座標系原點位於影象的左上角,區別於笛卡爾座標系的左下角。
  3. OpenCV中對於彩色影象的三通道值儲存順序是BGR,而不是RGB。一定要牢記。
  4. 對於影象的操作其實就是對錶示影象的numpy陣列的操作。要熟悉numpy(或python中的list和tuple)操作。可參考:廖雪峰Python教程

相關文章