1. 程式人生 > >學習OpenCV-Python——基本概念

學習OpenCV-Python——基本概念

Ubuntu下使用Anaconda安裝OpenCV3:

conda install --channel https://conda.anaconda.org/menpo opencv3

影象的表示

OpenCV使用numpy的array作為影象的資料結構,但是與主流的RGB結構不同的是,OpenCV採用了BGR的結構,這與歷史遺留問題有關。

影象的基本屬性

img.shape#影象的形狀

img.size#影象畫素數目

img.dtype#影象畫素值的型別,一般為float32或uint8

基本影象處理

影象讀寫

import
cv2 #寫影象 #mode可以選擇灰度圖或者三通道圖,預設三通道 #灰度圖:cv2.IMREAD_GRAYSACLE #彩色影象:cv2.IMREAD_GRAYSCALE #預設 #影象原來是什麼就是什麼:cv2.IMREAD_UNCHANGED img = cv2.imread(filename,mode) #寫影象 cv2.imwrite(filename,img)

影象顯示

#windows是視窗名字
cv2.imshow(windows_name,img)

視窗銷燬

#視窗銷燬的函式有兩種,分別是
cv2.destroyWindow(windows_name)
#和 cv2.destroyAllWindows() #區別是銷燬單個視窗和所有視窗

cv2.waitKey(time_of_millionseconds)函式

#由於呼叫imshow()後會馬上銷燬影象,此時要配合cv2.waitKey()函式使用
#cv2.waitKey()函式的用法有兩種,即等待一段時間或等待鍵盤輸入,返回鍵盤輸入的ascii值,若無輸入則返回-1
#用法一:
#當引數time_of_millionseconds>0,表示需要等待的毫秒數
if cv2.waitKey(1000):
    cv2.destroyAllWindows()
#用法二:
#當引數<=0時表示一直等待鍵盤的輸入(無輸入則無限等待),key_num即輸入的字元的ascii碼
if cv2.waitKey(0) == key_num: cv2.destroyAllWindows()

影象縮放、填充、裁剪

#直接指定大小
#interpolation是插值演算法,一般有:
#cv2.INTER_LINEAR: 雙線性插值,預設情況使用
#cv2.INTER_NEAREST: 最鄰近插值
#cv2.INTER_AREA: 使用畫素區域關係重新取樣,和cv2.INTER_NEAREST相似
#cv2.INTER_CUBIC: 4x4畫素鄰域內的雙立方插值
img_resize = cv2.resize(img,size,interpolation)
#根據比例縮放
#例:cv2.resize(img,(0,0),fx=0.5,fy=0.5)
img_resize = cv2.resize(img,size,fx,fy)

#分別在上下左右填充的畫素的大小
img_border = cv2.copyMakeBorder(img,margin_up,margin_down,margin_left,margin_right)

#影象裁剪
patch_img = img[begin1:end1,begin2:end2]

HSV格式

HSV分別是色調(Hue),飽和度(Saturation)和亮度(Value)

H調整顏色;S越大,影象色彩越豐富,顏色越鮮豔;V越大,影象越亮

相關操作

# H空間中,綠色比黃色的值高一點,所以給每個畫素+15,黃色的樹葉就會變綠
turn_green_hsv = img_hsv.copy()
turn_green_hsv[:, :, 0] = (turn_green_hsv[:, :, 0]+15) % 180
turn_green_img = cv2.cvtColor(turn_green_hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite('turn_green.jpg', turn_green_img)

# 減小飽和度會讓影象損失鮮豔,變得更灰
colorless_hsv = img_hsv.copy()
colorless_hsv[:, :, 1] = 0.5 * colorless_hsv[:, :, 1]
colorless_img = cv2.cvtColor(colorless_hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite('colorless.jpg', colorless_img)

# 減小亮度為原來一半
darker_hsv = img_hsv.copy()
darker_hsv[:, :, 2] = 0.5 * darker_hsv[:, :, 2]
darker_img = cv2.cvtColor(darker_hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite('darker.jpg', darker_img)

影象色彩空間變換函式cv2.cvtColor()

#mode一般為cv2.COLOR_BGR2HSV,cv2.COLOR_HSV2BGR,cv2.COLOR_BGR2GRAY
#cvt就是convert的意思
img_cvt = cv2.cvtColor(img,mode)

繪圖函式

OpenCV可以繪製的基本影象有直線cv2.line、長方形cv2.rectangle、圓cv2.circle、橢圓cv2.ellipse、多邊形cv2.polylines等,先介紹一下它們的公共引數。

img: 表示需要進行繪製的影象物件ndarray 。
color:表示繪製幾何圖形的顏色,採用BGR即上述說的(B、G、R) 。
thickness:表示繪製幾何圖形中線的粗細,預設為1,對於圓、橢圓等封閉影象取-1時是填充圖形內部。
lineType:表示繪製幾何圖形線的型別,預設8-connected線是光滑的,當取cv2.LINE_AA時線呈現鋸齒狀。

直線:cv2.line()

cv2.line(image, starting, ending, color, thickness, lineType)

引數starting、ending分別表示線的起點畫素座標、終點畫素座標。

長方形:cv2.rectangle()

cv2.rectangle(image, top-left, bottom-right, color, thickness, lineType)

引數top-left、bottom-right分別表示長方形的左上角畫素座標、右下角畫素座標。

圓形:cv2.circle()

cv2.circle(image, center, radius, color, thickness, lineType)

引數center、radius分別表示圓的圓心畫素座標、圓的半徑長度,圓繪製函式中當引數thickness = -1 時繪製的是實心圓,當thickness >= 0 時繪製的是空心圓。

橢圓:cv2.ellipse()

cv2.circle(image, center, (major-axis-length, minor-axis-length), angle, startAngle, endAngle, color, thickness, lineType)

橢圓繪製函式中當引數thickness = -1 時繪製的是實心橢圓,當thickness >= 0 時繪製的是空心橢圓,其他引數如下 :

center: 表示橢圓中心畫素座標
major-axis-length: 表示橢圓的長軸長度
minor-axis-length: 表示橢圓的短軸長度
angle: 表示橢圓在逆時針方向旋轉的角度
startAngle: 表示橢圓從主軸向順時針方向測量的橢圓弧的起始角度
endAngle: 表示橢圓從主軸向順時針方向測量的橢圓弧的終止時角度

多邊形:cv2.polylines()

cv2.polylines(image, [point-set], flag, color, thickness, lineType)

point-set: 表示多邊形點的集合。
flag: 當flag = True 時,則多邊形是封閉的,當flag = False 時,則多邊形只是從第一個到最後一個點連線組成的影象,沒有封閉。