學習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 時,則多邊形只是從第一個到最後一個點連線組成的影象,沒有封閉。