python3__深度學習:計算機視覺__OpenCV擴大影象資料庫
OpenCV擴大影象資料庫
由於無論使用何種演算法和框架對神經網路進行訓練,圖片的資料量始終是一個決定訓練模型好壞的重要前提。資料擴充套件是訓練模型的一個常用手段,對於模型的魯棒性以及準確率都有非常重要的幫助。
1 影象的隨機裁剪
圖片的隨機裁剪是一個常用的擴大影象資料庫的手段,好處是對於大多數的圖片資料,進行模型之前都需變成統一的大小。雖圖片的大小相同,但不同的裁剪位置卻能夠提供更多的資料樣本,從而提高基本的圖片資料的內容。
import cv2 import numpy as np import random import matplotlib.pyplot as plt img = cv2.imread("leaf.png") width, height, depth = img.shape img_width_box = width * 0.7 img_heigth_box = height * 0.7 # 擷取的圖片個數 for _ in range(10): # 均勻分佈隨機數 start_pointX = np.int(random.uniform(0, img_width_box)) start_pointY = np.int(random.uniform(0, img_heigth_box)) copyImg = img[start_pointX:300, start_pointY:300] copyImg = cv2.resize(copyImg, (100, 100)) cv2.imwrite("pic/"+"2_"+str(_)+".jpg", copyImg)
2 影象的隨機旋轉變換
相對於影象的旋轉、平移和翻轉(wrapAffine(): 仿射變換),影象的隨機旋轉變換並不會使得圖片變形。
cv2.getRotationMatrix2D(center, angle, scale): 計算2D旋轉的仿射矩陣
引數:
center: 旋轉的中心
angle: 旋轉的角度
scale: 縮放的倍數
【 問題:黑邊的去除(未完成)】
import cv2 import numpy as np from scipy import ndimage img = cv2.imread("leaf.png") width, height, depth = img.shape # 計算仿射矩陣 img_change = cv2.getRotationMatrix2D((width/2, height/2), 45, 1) # 仿射變換 res = cv2.warpAffine(img, img_change, (width, height)) cv2.imshow("res", res) cv2.waitKey()
3 影象色彩的隨機變換
import cv2 import numpy as np import random img = cv2.imread("leaf.png") img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 產生10張圖片 for i in range(10): # H範圍:[0, 180] # S範圍:[0, 255] # V範圍:[0, 255] turn_green_hsv = img_hsv.copy() turn_green_hsv[:, :, 0] = (turn_green_hsv[:, :, 0] + np.random.randint(1, 180)) % 180 turn_green_hsv[:, :, 1] = (turn_green_hsv[:, :, 1] + np.random.randint(1, 255)) % 255 turn_green_hsv[:, :, 2] = (turn_green_hsv[:, :, 2] + np.random.randint(1, 255)) % 255 turn_green_img = cv2.cvtColor(turn_green_hsv, cv2.COLOR_HSV2BGR) turn_green_img = cv2.resize(turn_green_img, (100, 100)) cv2.imwrite("pic/"+"12_"+str(i)+".jpg", turn_green_img)
4 對滑鼠的監控
使用滑鼠在生成的圖片上標記出目標位置是基本的資料處理內容。滑鼠操作輸入使用者介面操作,OpenCV同樣提供了對滑鼠操作的函式,這一部分功能主要由mouse_event完成。mouse_event的功能是監控滑鼠的操作,對滑鼠的點選、移動、放開等作出反應,根據不同的操作進行處理。
事件共如下12種:
EVENT_LBUTTONDBLCLK = 7 # 左鍵雙擊
EVENT_LBUTTONDOWN = 1 # 左鍵單擊
EVENT_LBUTTONUP = 4 # 左鍵釋放
EVENT_MBUTTONDBLCLK = 9 # 中間雙擊
EVENT_MBUTTONDOWN = 3 # 中間點選
EVENT_MBUTTONUP = 6 # 中間釋放
EVENT_MOUSEHWHEEL = 11 # 滑鼠滾輪釋放
EVENT_MOUSEMOVE = 0 # 滑鼠移動
EVENT_MOUSEWHEEL = 10 # 滑鼠滾輪
EVENT_RBUTTONDBLCLK = 8 # 右鍵雙擊
EVENT_RBUTTONDOWN = 2 # 右鍵點選
EVENT_RBUTTONUP = 5 # 右鍵釋放
import cv2
import numpy as np
# 標誌位:判斷滑鼠是否按下
drawing = False
ix, iy = -1, -1
rect_start = (0, 0)
# 建立回撥函式
def on_mouse(event, x, y, flags, param):
global drawing
global ix, iy
global rect_start
# 當按下左鍵:返回起始座標位置
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
# ix, iy = x, y
rect_start = (x, y)
# 滑鼠左鍵按下並移動:繪製圖形
# event: 判斷滑鼠是否移動
# flags: 判斷是否是左鍵按下
elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
if drawing == True:
# rectangle: (img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
# img: image
# pt1: start point
# pt2: end point
# color: 三原色
# thickness: 構成矩陣的線條的粗細
# lineType: 線條型別
# shift: 點座標中小數的位數
cv2.rectangle(img, rect_start, (x, y), (0, 0, 0), -1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
# 建立影象與視窗,並將視窗與回撥函式繫結
img = cv2.imread("leaf.png")
cv2.namedWindow("image")
cv2.setMouseCallback("image", on_mouse)
while True:
cv2.imshow("image", img)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()