四、影像基礎
1、像素
a. 什么是像素?
像素是構成影像的基本要素,
在灰度圖中,每一個像素值都是位于0–255中的整數,數值越小,像素越暗;數值越大,像素的亮度也越大,數值為0則代表黑色,數值為255則代表白色,在灰度圖中,往往只需要一個位元組來儲存每一個像素點,
在彩色圖中,每個像素都以RGB的形式呈現,紅、綠、藍分別占據一個位元組的空間,因此每個像素占據3位元組的存盤空間,通常以元組的形式表示,如:
Black(黑色) : (0, 0, 255) White(白色) : (255, 255, 255) Red(紅色) : (255, 0, 0)
Green(綠色) : (0, 255, 0) Blue(藍色) : (0, 0, 255) Aqua(淺綠色) : (0, 255, 255)
Fuchsia(紫紅色) : (255, 0, 255) Maroon(褐紅色) : (128, 0, 0) Navy(藏青色) : (0, 0, 128)
Olive(橄欖綠) : (128, 128, 0) Purple(紫紅色) : (128, 0, 128) Teal(深青色) : (0, 128, 128)
Yellow(黃色) : (255, 255, 0)
b. 坐標系
像素坐標系:縱軸為x(row),橫軸為y(colomn),這與我們熟知的空間坐標系不同,容易混淆,需要細細區分,
注意:Python語言的索引從0開始,
2、像素操作
老規矩,還是先放一段源代碼,
a. 源代碼展現
getting_and_setting.py
(From Practical Python and OpenCV, 3rd Edition)
from __future__ import print_function
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)
(b, g, r) = image[0, 0]
print("Pixel at (0, 0) - Red: {}, Green: {}, Blue: {}".format(r, g, b))
image[0, 0] = (0, 0, 255)
(b, g, r) = image[0, 0]
print("Pixel at (0, 0) - Red: {}, Green: {}, Blue: {}".format(r, g, b))
corner = image[0:100, 0:100]
cv2.imshow("Corner", corner)
image[0:100, 0:100] = (0, 255, 0)
cv2.imshow("Updated", image)
cv2.waitKey(0)
b. 代碼解釋
Line 1-9
相信沒什么好解釋的,匯入所需的包并且決議命令列引數,忘了的可以回顧一下上節課的筆記O(∩_∩)O~
Line 10
cv2.imshow("Original", image)
同樣是通過影像讀取函式imread加載圖片,設定視窗顯示名稱為"Original",
Line 11-12
(b, g, r) = image[0, 0]
print("Pixel at (0, 0) - Red: {}, Green: {}, Blue: {}".format(r, g, b))
存盤影像中最左上角像素點的RGB并將其通過format函式列印輸出,
【注意因為存盤影像時將其轉換成了Numpy陣列,其中像素的顏色以BGR的形式存盤,】
Line 14-16
image[0, 0] = (0, 0, 255)
(b, g, r) = image[0, 0]
print("Pixel at (0, 0) - Red: {}, Green: {}, Blue: {}".format(r, g, b))
更改第一個像素點的顏色為紅色并重新列印,
Line 18-19
corner = image[0:100, 0:100]
cv2.imshow("Corner", corner)
截取原影像左上角100行100列的像素點并以"Corner"的名稱顯示為一個獨立的影像視窗,
Line 21-24
image[0:100, 0:100] = (0, 255, 0)
cv2.imshow("Updated", image)
cv2.waitKey(0)
將原影像左上角的100*100個像素點全部變成綠色,并將更新后的影像以名稱為"Updated"的視窗呈現,
3、查看運行結果
Pixel at (0, 0) - Red: 254, Green: 254, Blue: 254
Pixel at (0, 0) - Red: 255, Green: 0, Blue: 0
結果顯示了剛剛我們要求列印的修改前和修改后的像素點RGB以及三幅影像,
![]() | ![]() | ![]() |
|---|---|---|
| “Original” | “Corner” | “Updated” |
仔細觀察,發現名為"Corner"的視窗中,影像左上角的一個小點變成了紅色(就是我們修改的位置為[0, 0]的像素),
4、關于Numpy
a. Why Numpy?
雖然Python自帶了創建陣列的功能,但采用Numpy會使我們的代碼計算效率大大提高,
b. Numpy的陣列切片
Numpy的陣列切片為無復制切片,當對切片進行賦值操作時,原陣列的數值也會發生變化,那么該如何將陣列中的部分資料完全復制到一個新陣列呢?
淺拷貝與深拷貝
淺拷貝:Numpy里的切片類似于C語言里的指標,屬于淺拷貝,
x2_sub = x2([:2, :3])
深拷貝:完全復制陣列內容,對新陣列的內容進行更改不會影響原陣列,
x2_sub_copy = x2([:2, :3]).copy( )
Python中的深拷貝
import copy
zs = copy.deepcopy(xs)
思考題
如何將從0-1000的亮度等級線性變換到任意的A~B區間內?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/159039.html
標籤:其他



