Python調用OpenCV像素操作

Python調用OpenCV進行操作的時候基本上感覺就是對numpy進行操作,跟numpy是挺相關的。

1、像素操作

OpenCV獲取圖像(x,y)處的像素值:

px=img[x,y]

當圖像是三通道的時候返回的是BGR三通道的值,如果是灰度圖的話就返回一個亮度值

同樣的如果要對圖像(x,y)處賦值的話,也通過這種方式來實現:

#三通道
img[x,y]=[255,255,255]
#單通道
img[x,y]=255

2、獲取圖像屬性

獲取圖像的形式,這個跟numpy的操作基本一樣,通過shape來獲取:

img.shape

會返回一個圖像的形態,也就是(行,列,通道),OpenCV的圖像還有一個size屬性,這個返回的是總的像素數量行*列*通道數。

通過圖像的dtype來獲取圖像的像素數據類型:

img.dtype

返回的值類型如uint8等

3、圖像ROI

OpenCV獲取圖像的ROI的時候可以使用類似numpy的方式來獲取,如:

roi=img[r0:r1,c0:c1]

4、通道分離和合並

通道分離使用的是函數split:

b,g,r=cv2.split(img)

通道分離用的是merge函數:

img=cv2.merge(b,g,r)

當可以不用split的時候就不要用,改用numpy的索引操作,因爲split是比較耗時的操作。

5、圖像擴充邊界

擴充邊界的時候就用函數copyMakeBorder(),這個函數有四個參數:

  1. src:輸入圖像

  2. top,bottom,left,right:對應的邊界的像素數目

  3. borderType要添加哪種類型的邊界

    1. cv2.BORDER_CONSTANT,添加有顏色的常數值邊界,也就是下一個參數value;

    2. cv2.BORDER_REFLECT,邊界顏色的鏡像,fedcba|abcdefgh|hgfedcb;

    3. cv2.BORDER_REFLECT_101或者cv2.BORDER_DEFAULT,gfedcb|abcdefgh|gfedcba;

    4. cv2.BORDER_REPLICATE,重複最後一個像素來填充;

    5. cv2.BORDER_WRAP,這個比較...,應該是左移右移來填充吧,cdefgh| abcdefgh|abcdefg

  4. value:邊界顏色

import numpy as np
import cv2 as cv

src = cv.imread("D:/lena.bmp")

src = cv.resize(src, (256, 256))
dst = cv.copyMakeBorder(src, 50, 50, 50, 50, 
    cv.BORDER_CONSTANT, value=[255, 255, 255])
cv.imshow('BORDER_CONSTANT', dst)

src_gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)

dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_REFLECT)
cv.imshow('BORDER_REFLECT', dst)

dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_REFLECT_101)
cv.imshow('BORDER_REFLECT_101', dst)

dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_REPLICATE)
cv.imshow('BORDER_REPLICATE', dst)

dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_WRAP)
cv.imshow('BORDER_WRAP', dst)
cv.waitKey(0)
cv.destroyAllWindows()

 

天還未黑,雲怎敢灰;

雨還未下,風怎敢吹;

瓜還未熟,秧怎敢枯;

花還未落,樹怎敢死;

你還未嫁,我怎敢老。

-- 汪國真 《怎敢》

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章