欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入了解Python?Opencv數(shù)據(jù)增強

 更新時間:2022年02月26日 15:28:12   作者:三個臭皮姜  
常見的數(shù)據(jù)增強操作有:按比例放大或縮小圖片、旋轉(zhuǎn)、平移、水平翻轉(zhuǎn)、改變圖像通道等。本文將通過Python?OpenCV實現(xiàn)這些操作,需要的可以參考一下

常見的數(shù)據(jù)增強操作有:按比例放大或縮小圖片、旋轉(zhuǎn)、平移、水平翻轉(zhuǎn)、改變圖像通道等。

1.按比例放大和縮小

? 擴展縮放只是改變圖像的尺寸大小。OpenCV 提供的函數(shù) cv2.resize()可以實現(xiàn)這個功能。圖像的尺寸可以自己手動設置,也可以指定縮放因子。可以選擇使用不同的插值方法。在縮放時我們推薦使用 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庫中第二個參數(shù)是目標大小,例如如果我想把圖片resize成300*300大小的,可以這么寫:

img = cv2.resize(img,(300,300))

2.平移圖像

平移就是將對象換一個位置。如果你要沿(x,y)方向移動,移動的距離是(tx,ty),你可以以下面的方式構建移動矩陣:

可以使用 Numpy 數(shù)組構建這個矩陣(數(shù)據(jù)類型是 np.float32),然后把它傳給函數(shù)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))  # 變換函數(shù)
    return img

我這里封裝的tx和ty分別為水平和豎直方向需要移動的像素點數(shù)。

3.旋轉(zhuǎn)圖像

OpenCV 提供了一個函數(shù):cv2.getRotationMatrix2D

# 旋轉(zhuǎn)
def rotation(img,angle,scale):
    rows = img.shape[0]
    cols = img.shape[1]
    # 這里的第一個參數(shù)為旋轉(zhuǎn)中心,第二個為旋轉(zhuǎn)角度,第三個為旋轉(zhuǎn)后的縮放因子
    # 可以通過設置旋轉(zhuǎn)中心,縮放因子,以及窗口大小來防止旋轉(zhuǎn)后超出邊界的問題
    M = cv2.getRotationMatrix2D((cols / 2, rows / 2), angle, scale) # 向左旋轉(zhuǎn)angle度并縮放為原來的scale倍
    img = cv2.warpAffine(img, M, (cols, rows)) # 第三個參數(shù)是輸出圖像的尺寸中心
    return img

4.鏡像變換

Opencv提供了cv2.flip()函數(shù),可以第二個參數(shù)為1時為水平翻轉(zhuǎn),為0時垂直翻轉(zhuǎn)。為了后面調(diào)用方便,我還是自己封裝了一下。

# 鏡像變換
def mirror(img,mode):
    img = cv2.flip(img, mode)  # mode = 1 水平翻轉(zhuǎn) mode = 0 垂直翻
    return img

5.添加椒鹽噪聲

椒鹽噪聲為純黑或純白的像素點,隨機生成。

# 添加椒鹽噪聲
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

6.添加高斯噪聲

與椒鹽噪聲不同,高斯噪聲是彩色的,方差越大時噪聲越大。

# 添加高斯噪聲
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

7.模糊化

將圖片模糊或平滑有多種算法,例如高斯模糊、中值模糊、均值模糊等,我這里使用一個比較普通的cv2.blur()實現(xiàn)。同樣也是先封裝方便我后面調(diào)用。

# 模糊
def blur(img,scale):
    img = cv2.blur(img,(scale,scale)) # scale越大越模糊
    return img

這里的scale其實就是濾波器的尺寸,一般取奇數(shù),scale越大越模糊,

8.重新組合顏色通道

在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

實例

我有以下幾張測試圖片:

我希望隨機地對這些圖片進行一些變換,最終執(zhí)行結果如下:

可以看到程序?qū)ξ业膱D片隨機進行了各種變換,我這里只是一次變換,讀者也可以嘗試對圖片同時進行多種變換。

本次程序如下:

#!/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))  # 變換函數(shù)
    return img


# 旋轉(zhuǎn)
def rotation(img, angle, scale):
    rows = img.shape[0]
    cols = img.shape[1]
    # 這里的第一個參數(shù)為旋轉(zhuǎn)中心,第二個為旋轉(zhuǎn)角度,第三個為旋轉(zhuǎn)后的縮放因子
    # 可以通過設置旋轉(zhuǎn)中心,縮放因子,以及窗口大小來防止旋轉(zhuǎn)后超出邊界的問題
    M = cv2.getRotationMatrix2D((cols / 2, rows / 2), angle, scale)  # 向左旋轉(zhuǎn)angle度并縮放為原來的scale倍
    img = cv2.warpAffine(img, M, (cols, rows))  # 第三個參數(shù)是輸出圖像的尺寸中心
    return img


# 鏡像變換
def mirror(img, mode):
    img = cv2.flip(img, mode)  # mode = 1 水平翻轉(zhuǎn) 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]), # 第一個參數(shù)為函數(shù)名,后面為函數(shù)調(diào)用時的參數(shù)
                     ('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) # 隨機選擇一個函數(shù)執(zhí)行
        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() # 執(zhí)行
    print('finished!')

總結

還有其他很多的數(shù)據(jù)增強操作,例如隨機裁剪圖像、添加顏色擾動等等。另外也有其他庫可以進行這些操作,例如Keras中的圖片預處理process庫。我這種是離線式的,希望能將變換后的圖片保存下來。

以上就是深入了解Python Opencv數(shù)據(jù)增強的詳細內(nèi)容,更多關于Python Opencv數(shù)據(jù)增強的資料請關注腳本之家其它相關文章!

相關文章

  • 深入解析Python中filter函數(shù)的使用

    深入解析Python中filter函數(shù)的使用

    在Python中,filter函數(shù)是一種內(nèi)置的高階函數(shù),它能夠接受一個函數(shù)和一個迭代器,然后返回一個新的迭代器,本文主要來介紹一下Python中filter函數(shù)的具體用法,需要的可以參考一下
    2023-07-07
  • Mysql數(shù)據(jù)庫反向生成Django里面的models指令方式

    Mysql數(shù)據(jù)庫反向生成Django里面的models指令方式

    這篇文章主要介紹了Mysql數(shù)據(jù)庫反向生成Django里面的models指令方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 深入理解Python中__init__.py文件

    深入理解Python中__init__.py文件

    本文主要介紹了深入理解Python中__init__.py文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • python中GIL的原理及用法總結

    python中GIL的原理及用法總結

    在本篇文章里小編給大家整理的是一篇關于python中GIL的原理及用法總結內(nèi)容,有需要的朋友們可以學習參考下。
    2021-03-03
  • 如何使用Python數(shù)據(jù)清洗庫

    如何使用Python數(shù)據(jù)清洗庫

    數(shù)據(jù)清洗是數(shù)據(jù)處理過程中至關重要的一部分,本文主要介紹了如何使用Python數(shù)據(jù)清洗庫,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • 詳解Python3中ceil()函數(shù)用法

    詳解Python3中ceil()函數(shù)用法

    在本篇內(nèi)容里我們給大家整理了關于Python3中ceil()函數(shù)用法以及相關知識點,需要的學習一下吧。
    2019-02-02
  • python使用PyGame繪制圖像并保存為圖片文件的方法

    python使用PyGame繪制圖像并保存為圖片文件的方法

    這篇文章主要介紹了python使用PyGame繪制圖像并保存為圖片文件的方法,涉及Python使用PyGame操作圖片的相關技巧,需要的朋友可以參考下
    2015-04-04
  • 5個Python自動化運維腳本分享

    5個Python自動化運維腳本分享

    Python 是一種流行的編程語言,具有豐富的第三方庫和強大的自動化能力,適用于許多不同的領域,許多運維工程師會使用 Python 腳本來自動化運維任務,所以本文為大家整理了5個Python自動化運維腳本,有需要的可以參考下
    2023-08-08
  • 淺談pandas篩選出表中滿足另一個表所有條件的數(shù)據(jù)方法

    淺談pandas篩選出表中滿足另一個表所有條件的數(shù)據(jù)方法

    今天小編就為大家分享一篇淺談pandas篩選出表中滿足另一個表所有條件的數(shù)據(jù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • 詳解Python安裝scrapy的正確姿勢

    詳解Python安裝scrapy的正確姿勢

    Scrapy是一個為了爬取網(wǎng)站數(shù)據(jù)提取結構性數(shù)據(jù)而編寫的應用框架。這篇文章主要介紹了Python安裝scrapy的正確姿勢,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-06-06

最新評論