小強學Python+OpenCV之-1.2影象基礎
目標
學完本節,我們將理解:
- 影象的基本元素是畫素,什麼是畫素。
- 影象的座標系統是怎樣的。
- 操作畫素的RGB值
- 通過numpy陣列操作影象
1. 什麼是畫素
畫素是組成影象的最小單位。我們可以看下面這張圖:
我們常常像下面這樣表述一幅影象的大小。
300 x 200大小。這裡的300和200便是指的畫素。一幅300 x 200的影象表示有300*200=6萬個畫素。
通常,畫素的值我們稱之為強度。這裡可能要引入一個概念-“通道”才會比較好理解一點。
而影象通常會用兩種方式表示:灰度影象和彩色影象。
灰度影象指的是,每個畫素的值為一個8位無符號數表示的值,範圍是:0-255.也就是說,灰度影象只是用一個通道來表示畫素的強度。如下面的圖所示:
![Uploading image_coor_594914.png . . .]
而彩色影象是由三個8位(也有可能是16位,32位等)無符號數表示的值。什麼?我沒聽錯吧。三個數會表示成什麼樣子?沒錯,三個數表示成一個numpy陣列(相當於一維陣列)。三個數分別取不同的值(0-255),就可以表示出總共16777216種顏色。
對於三原色RGB的描述,可參考:RGB color model
座標系統
假設我們有一幅5*5的影象,那麼它的座標是這樣的:
座標系的原點在影象的左上角,畫素(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
可以看到如下圖:
(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)
執行指令碼,得到如下顯示:
OK。至此,我們知道了:
- 畫素是組成影象的最小單位,有灰度(單通道)和彩色影象(三通道)的區別。
- 影象的座標系原點位於影象的左上角,區別於笛卡爾座標系的左下角。
- OpenCV中對於彩色影象的三通道值儲存順序是BGR,而不是RGB。一定要牢記。
- 對於影象的操作其實就是對錶示影象的numpy陣列的操作。要熟悉numpy(或python中的list和tuple)操作。可參考:廖雪峰Python教程
相關文章
- 影象二值化(python+opencv)PythonOpenCV
- 影象拼接基礎學習筆記筆記
- Python+OpenCV 影象風格遷移(模仿名畫)PythonOpenCV
- 強化學習(一)模型基礎強化學習模型
- 強化學習的基礎缺陷強化學習
- AcWing演算法基礎1.2演算法
- 影象處理之影象增強
- opencv學習之基礎OpenCV
- 數學基礎之微積分
- 強化學習-學習筆記1 | 基礎概念強化學習筆記
- Go 之基礎速學 (一)Go
- 【Elasticsearch學習】之基礎概念Elasticsearch
- 深度學習基礎之 Dropout深度學習
- 數學基礎之機率
- java基礎學習之--XMLJavaXML
- 1.2程式設計基礎之變數定義、賦值及轉換程式設計變數賦值
- Javascript基礎之-強制型別轉換(三)JavaScript型別
- Javascript基礎之-強制型別轉換(一)JavaScript型別
- python基礎 函式之 強大的zipPython函式
- java基礎加強Java
- UI基礎(五)之代理、通知的小結UI
- 小程式開發之基礎知識(0)
- Python之物件導向基礎小練Python物件
- java基礎學習:JavaWeb之ServletJavaWebServlet
- pandas學習之Python基礎Python
- JAVA基礎學習篇之反射Java反射
- Java學習之基礎語法Java
- MySQL學習基礎之起航篇MySql
- Oracle之PL/SQL基礎學習OracleSQL
- Blazor和Vue對比學習(基礎1.2):模板語法和Razor語法BlazorVue
- 小程式基礎
- 抖音小程式基礎之 小程式有哪些檔案構成
- MATLAB數字影象處理(二)影象增強Matlab
- 【0基礎學爬蟲】爬蟲基礎之資料儲存爬蟲
- 【0基礎學爬蟲】爬蟲基礎之檔案儲存爬蟲
- 前端基礎之jQuery基礎前端jQuery
- java基礎學習_io流之FileInputStreamJava
- Flutter學習之認知基礎元件Flutter元件