<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
常見的資料增強操作有:按比例放大或縮小圖片、旋轉、平移、水平翻轉、改變影象通道等。
擴充套件縮放只是改變影象的尺寸大小。OpenCV 提供的函數 cv2.resize()可以實現這個功能。影象的尺寸可以自己手動設定,也可以指定縮放因子。可以選擇使用不同的插值方法。在縮放時我們推薦使用 cv2.INTER_AREA,在擴充套件時我們推薦使用 v2.INTER_CUBIC(慢) 和 v2.INTER_LINEAR。預設情況下所有改變影象尺寸大小的操作使用的插值方法都是 cv2.INTER_LINEAR。
# 縮小 -- 寬和高都縮小為原來的scale倍 def zoom_down(img,scale): img = cv2.resize(img,None,fx= scale,fy= scale,interpolation=cv2.INTER_CUBIC) return img # 放大 -- 寬和高都放大為原來的scale倍 def zoom_up(img,scale): img = cv2.resize(img,None,fx= scale,fy= scale,interpolation=cv2.INTER_CUBIC) return img
resize庫中第二個引數是目標大小,例如如果我想把圖片resize成300*300大小的,可以這麼寫:
img = cv2.resize(img,(300,300))
平移就是將物件換一個位置。如果你要沿(x,y)方向移動,移動的距離是(tx,ty),你可以以下面的方式構建移動矩陣:
可以使用 Numpy 陣列構建這個矩陣(資料型別是 np.float32),然後把它傳給函數cv2.warpAffine()。
mat_translation = np.float32([[1, 0, 20], [0, 1, 30]])
例如上面是的矩陣是將影象往水平方向上移動20個畫素點,豎直方向上移動30個畫素點。
範例:
# 平移 -- 水平平移或豎直方向平移 def translation(img,tx,ty): height = img.shape[0] width = img.shape[1] mat_translation = np.float32([[1, 0, tx], [0, 1, ty]]) # 變換矩陣:設定平移變換所需的計算矩陣:2行3列 img = cv2.warpAffine(img, mat_translation, (width + tx, height + ty)) # 變換函數 return img
我這裡封裝的tx和ty分別為水平和豎直方向需要移動的畫素點數。
OpenCV 提供了一個函數:cv2.getRotationMatrix2D
# 旋轉 def rotation(img,angle,scale): rows = img.shape[0] cols = img.shape[1] # 這裡的第一個引數為旋轉中心,第二個為旋轉角度,第三個為旋轉後的縮放因子 # 可以通過設定旋轉中心,縮放因子,以及視窗大小來防止旋轉後超出邊界的問題 M = cv2.getRotationMatrix2D((cols / 2, rows / 2), angle, scale) # 向左旋轉angle度並縮放為原來的scale倍 img = cv2.warpAffine(img, M, (cols, rows)) # 第三個引數是輸出影象的尺寸中心 return img
Opencv提供了cv2.flip()函數,可以第二個引數為1時為水平翻轉,為0時垂直翻轉。為了後面呼叫方便,我還是自己封裝了一下。
# 映象變換 def mirror(img,mode): img = cv2.flip(img, mode) # mode = 1 水平翻轉 mode = 0 垂直翻 return img
椒鹽噪聲為純黑或純白的畫素點,隨機生成。
# 新增椒鹽噪聲 def spiced_salt_noise(img,prob): output = np.zeros(img.shape,np.uint8) thres = 1 - prob for i in range(img.shape[0]): for j in range(img.shape[1]): rdn = random.random() if rdn < prob: output[i][j] = 0 # 椒鹽噪聲由純黑和純白的畫素點隨機組成 elif rdn > thres: output[i][j] = 255 else: output[i][j] = img[i][j] return output
與椒鹽噪聲不同,高斯噪聲是彩色的,方差越大時噪聲越大。
# 新增高斯噪聲 def gasuss_noise(image, mean = 0, var = 0.01): ''' 新增高斯噪聲 mean : 均值 var : 方差,方差越大越模糊 ''' image = np.array(image/255, dtype=float) noise = np.random.normal(mean, var ** 0.5, image.shape) out = image + noise if out.min() < 0: low_clip = -1. else: low_clip = 0. out = np.clip(out, low_clip, 1.0) out = np.uint8(out*255) return out
將圖片模糊或平滑有多種演演算法,例如高斯模糊、中值模糊、均值模糊等,我這裡使用一個比較普通的cv2.blur()實現。同樣也是先封裝方便我後面呼叫。
# 模糊 def blur(img,scale): img = cv2.blur(img,(scale,scale)) # scale越大越模糊 return img
這裡的scale其實就是濾波器的尺寸,一般取奇數,scale越大越模糊,
在opencv中,影象的通道順序為BGR,也就是藍綠紅,可以改變成其他順序以得到不同的效果。
# 重新組合顏色通道 def change_channel(img): b = cv2.split(img)[0] g = cv2.split(img)[1] r = cv2.split(img)[2] brg = cv2.merge([b, r, g]) # 可以自己改變組合順序 return brg
我有以下幾張測試圖片:
我希望隨機地對這些圖片進行一些變換,最終執行結果如下:
可以看到程式對我的圖片隨機進行了各種變換,我這裡只是一次變換,讀者也可以嘗試對圖片同時進行多種變換。
本次程式如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2022/2/18 16:30 # @Author : 若谷 # @File : Data_Augumentation.py # @Software: PyCharm import numpy as np import cv2 import random import os import sys # 縮小 -- 寬和高都縮小為原來的scale倍 def zoom_down(img, scale): img = cv2.resize(img, None, fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC) return img # 放大 -- 寬和高都放大為原來的scale倍 def zoom_up(img, scale): img = cv2.resize(img, None, fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC) return img # 平移 -- 水平平移或豎直方向平移 def translation(img, tx, ty): height = img.shape[0] width = img.shape[1] mat_translation = np.float32([[1, 0, tx], [0, 1, ty]]) # 變換矩陣:設定平移變換所需的計算矩陣:2行3列 img = cv2.warpAffine(img, mat_translation, (width + tx, height + ty)) # 變換函數 return img # 旋轉 def rotation(img, angle, scale): rows = img.shape[0] cols = img.shape[1] # 這裡的第一個引數為旋轉中心,第二個為旋轉角度,第三個為旋轉後的縮放因子 # 可以通過設定旋轉中心,縮放因子,以及視窗大小來防止旋轉後超出邊界的問題 M = cv2.getRotationMatrix2D((cols / 2, rows / 2), angle, scale) # 向左旋轉angle度並縮放為原來的scale倍 img = cv2.warpAffine(img, M, (cols, rows)) # 第三個引數是輸出影象的尺寸中心 return img # 映象變換 def mirror(img, mode): img = cv2.flip(img, mode) # mode = 1 水平翻轉 mode = 0 垂直翻 return img # 新增椒鹽噪聲 def spiced_salt_noise(img, prob): output = np.zeros(img.shape, np.uint8) thres = 1 - prob for i in range(img.shape[0]): for j in range(img.shape[1]): rdn = random.random() if rdn < prob: output[i][j] = 0 # 椒鹽噪聲由純黑和純白的畫素點隨機組成 elif rdn > thres: output[i][j] = 255 else: output[i][j] = img[i][j] return output # 模糊 def blur(img, scale): img = cv2.blur(img, (scale, scale)) # scale越大越模糊 return img # 新增高斯噪聲 def gasuss_noise(image, mean=0, var=0.01): ''' 新增高斯噪聲 mean : 均值 var : 方差,方差越大越模糊 ''' image = np.array(image / 255, dtype=float) noise = np.random.normal(mean, var ** 0.5, image.shape) out = image + noise if out.min() < 0: low_clip = -1. else: low_clip = 0. out = np.clip(out, low_clip, 1.0) out = np.uint8(out * 255) return out # 重新組合顏色通道 def change_channel(img): b = cv2.split(img)[0] g = cv2.split(img)[1] r = cv2.split(img)[2] brg = cv2.merge([b, r, g]) # 可以自己改變組合順序 return brg # 隨機進行以上操作 def Data_Augument(): for i in images_list: img = cv2.imread(image_dir+i) # 圖片路徑+圖片名字 cv2.imshow('img',img) functions = [('zoom_down', [img, 0.8]), # 第一個引數為函數名,後面為函數呼叫時的引數 ('zoom_up', [img, 1.2]), ('translation', [img, 20, 30]), ('rotation', [img, 15, 0.9]), ('mirror', [img, 1]), ('spiced_salt_noise', [img, 0.01]), ('blur', [img, 5]), ('gasuss_noise', [img, 0, 0.01]), ('change_channel', [img])] choice = random.choice(functions) # 隨機選擇一個函數執行 this_module = sys.modules[__name__] # 當前檔案 res = getattr(this_module, choice[0])(*choice[1]) cv2.imwrite(output_dir + i, res) if __name__ == '__main__': image_dir = './test/' # 源圖片路徑 images_list = os.listdir(image_dir) nums = len(os.listdir(image_dir)) print('found %d pictures' % nums) output_dir = './output/' # 影象變換後的儲存路徑 Data_Augument() # 執行 print('finished!')
還有其他很多的資料增強操作,例如隨機裁剪影象、新增顏色擾動等等。另外也有其他庫可以進行這些操作,例如Keras中的圖片預處理process庫。我這種是離線式的,希望能將變換後的圖片儲存下來。
以上就是深入瞭解Python Opencv資料增強的詳細內容,更多關於Python Opencv資料增強的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45