天天看點

opencv-python-學習筆記五(圖像的基本操作)

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      
opencv-python-學習筆記五(圖像的基本操作)

擷取單一像素值和修改

方法一:直接通路

以下參數含義:

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

 制作圖檔相框