python-opencv中的圖像表示
OpenCV中圖像讀入的資料格式是numpy的ndarray資料格式。用數組描述圖像。是BGR格式,取值範圍是[0,255].
分為三個次元:
第一次元:Height 高度,對應圖檔的 行數
第二次元:Width 寬度,對應圖檔的 列數
第三次元:Value 代表BGR三通道的值 在opencv中,其中 0代表B,1代表G,2代表R
import cv2 as cv
import numpy as np
img = np.zeros((3, 2, 3), np.uint8)#三行兩列3個通道
cv.imshow("image", img)
k = cv.waitKey(0) & 0xFF

擷取單一像素值和修改
方法一:直接通路
以下參數含義:
x:x坐标
y:y坐标
0:B通道 1:G通道 2:R通道
首先加載一張彩色圖檔
import cv2
import numpy as np
img = cv2.imread('4.jpg')
通路像素
px = img[y,x]
print(px) # 輸出值是 x,y 處,藍b,綠g,紅r 的數組 [100,200,190]
px = img[y,x,0]
print(px) # 指定輸出x,y處 ,0(B)通道的像素值 結果等于 157
修改像素
img[y, x] = [255, 255, 255] # 修改(x,y)處3個通道的像素值為 [255,255,255]
方法二:通過numpy優化庫
Numpy是一個優化的庫,能夠快速計算數組。是以如果一個個通路每個像素并修改它的值是很慢的,也不推薦。一般來說都是選擇數組的一片區域進行修改。
import cv2
import numpy as np
img = cv2.imread('4.jpg')
讀取
print(img.item(10, 10,2))
如果想要通路BGR3個通道的值,需要分開通路,調用3次
修改
img.itemset((10, 10, 2), 100)
圖檔ROI(region of interest)
有時候,你會需要處理圖檔的特定區域。對于圖檔的眼部識别,首先對整個圖檔進行面部識别,找到臉以後,在臉的區域内找眼睛。這個方法能夠提高準确度(因為眼睛總是在臉上的)性能上也好(因為我們找的區域更小)
截取圖檔
import cv2 as cv
import numpy as np
img = cv.imread('4.jpg')
ball = img[280:340, 330:390] #img[y1:x1,y2:x2] y1:x1 對角線左上點的值 y2:x2 對角線右下點的值
img[100:160, 150:210] = ball #img[y1:x1,y2:x2]
cv.imshow("image",img)
cv.waitKey(0)
圖像通道的分割和合并
有時候可能需要将圖檔的3個通道分割出來,有時候會需要将一個通道合并到其它通道。
拆分通道
方法1:
b,g,r = cv.split(img)
參數:
img:待拆分圖像
方法2:
b = img[:,:,0] #隻擷取圖像的一個通道
注意:假設你想把所有的紅色像素變成0,你不用這麼分割,你可以簡單的使用Numpy索引,這樣更快。img[:,:,2]=0
警告:cv2.split()是一個成本很高的操作(執行時間),是以隻在必要的時候使用。Numpy索引要更有效率,能用就用。
合并通道
dst=cv.merge(mv[, dst])
img = cv.merge((b,g,r))