1. 程式人生 > >python3__深度學習:計算機視覺__OpenCV擴大影象資料庫

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