2024年3月12日 更新

Pythonで画像処理② Data Augmentation (画像の水増し)

画像の水増し、Data Augmentationと呼ばれる方法になりますが、学習に使う画像に変形を加えたり、ノイズを加えたり、明るさを変えたりといった処理を行う方法を紹介します。学習画像に様々な処理を行うことで認識がロバストになるというメリットがあります。

91,750 view お気に入り 1
import cv2
import numpy as np
import random
import matplotlib.pyplot as plt
%matplotlib inline

img = cv2.imread("img2.png",0)
rows,cols=img.shape

pts1 = np.float32([[0,0],[0,100],[100,100],[100,0]])
pts2 = np.float32([[0,0],[0, 99],[101,101],[100,0]])

M = cv2.getPerspectiveTransform(pts1,pts2)
dst = cv2.warpPerspective(img,M,(cols,rows))

plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()
warpPerspective.py
 (4312)

重ね合わせてみると。。
 (4314)

ずれているのがわかります。同様のことを百枚分処理して重ね合わせてみます。
import cv2
import numpy as np
import random
import matplotlib.pyplot as plt
%matplotlib inline

img = cv2.imread("img2.png",0)
rows,cols=img.shape
sumimg = img/255.0
for i in range(100):
    var=20
    pts1 = np.float32([[0,0],[0,rows],[cols,rows],[cols,0]])
    pts2 = np.float32([[random.randint(-var,var),random.randint(-var,var)],
                       [random.randint(-var,var), rows+random.randint(-var,var)],
                       [cols+random.randint(-var,var),rows+random.randint(-var,var)],
                       [cols+random.randint(-var,var),random.randint(-var,var)]])

    M = cv2.getPerspectiveTransform(pts1,pts2)
    dst = cv2.warpPerspective(img,M,(cols,rows))
    sumimg+=dst/255.0

plt.imshow(sumimg)
plt.colorbar()
plt.show()
100.py
 (4318)

var=20となっているところをvar=40とすると、ブレが大きくなります。
 (4320)

画像を分割し、それぞれで異なる変換行列で変換を行う

 (4323)

 (4324)

このような画像全体を不規則に歪める処理を実装してみます。
import cv2
import numpy as np
import random
import matplotlib.pyplot as plt
%matplotlib inline

img = cv2.imread("img2.png",0)

def transform(img):
    N=12
    S=16
    originalSize = img.shape
    img = cv2.resize(img,(S*N+1,S*N+1))
    rows,cols=(S*N+1,S*N+1)
    points=[]
    #N*Nのグリッドを作成
    for i in range(0,rows,S):
        tmp=[]
        for j in range(0,cols,S):
            tmp.append([i,j])
        points.append(tmp)

    points_t=[]
    #10*10のグリッドを作成
    for i in range(0,rows,S):
        tmp=[]
        for j in range(0,cols,S):
            n=6
            tmp.append([i+random.uniform(-S//n,S//n),j+random.uniform(-S//n,S//n)])
        points_t.append(tmp)

    t = img*0

    for i in range(N):
        for j in range(N):
            pts1 = np.float32([points[i][j],points[i+1][j],points[i+1][j+1],points[i][j+1]])
            pts2 = np.float32([points_t[i][j],points_t[i+1][j],points_t[i+1][j+1],points_t[i][j+1]])

            M = cv2.getPerspectiveTransform(pts1,pts2)
            dst = cv2.warpPerspective(img,M,(cols,rows))
            pts1_ = np.int32(pts1).reshape((-1,1,2))
            pts2_ = np.int32(pts2).reshape((-1,1,2))
            mask = dst*0

            cv2.fillPoly(mask,[pts2_],1)
            t = cv2.bitwise_or(t,dst*mask)
    t = cv2.resize(t,originalSize)
    return t

t=transform(img)
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(t),plt.title('Output')
plt.show()
transform.py
5枚まとめて処理して重ね合わせてみます。
50 件

関連する記事 こんな記事も人気です♪

LP-tech2周年記念#人気記事のまとめ#第5位〜第1位

LP-tech2周年記念#人気記事のまとめ#第5位〜第1位

LP-techが始まってから2周年を迎えました。ここまでLP-techを続けることができたのも読者の皆様のおかげだと思っています。そこで、LP-techの感謝祭ということで、人気の記事を第20位から第1位までをご紹介します。今回は第5位〜第1位までです。
LP-tech2周年記念#人気記事のまとめ#第15位〜第11位

LP-tech2周年記念#人気記事のまとめ#第15位〜第11位

LP-techが始まってから2周年を迎えました。ここまでLP-techを続けることができたのも読者の皆様のおかげだと思っています。そこで、LP-techの感謝祭ということで、人気の記事を第20位から第1位までをご紹介します。今回は第15位〜第11位までです。
医用画像位置合わせの基礎⑥ 〜アフィン変換とは?〜

医用画像位置合わせの基礎⑥ 〜アフィン変換とは?〜

今回は、画像位置合わせに用いられるアフィン変換をご紹介します。
木田智士 | 18,270 view
画像の再構成理論〜概要、まとめ〜

画像の再構成理論〜概要、まとめ〜

今回は、以前4回にわたって記事として投稿した画像の再構成理論の概要について述べ、それのまとめをしたいと思います。
画像処理におけるフーリエ変換④〜pythonによるフィルタ設計〜

画像処理におけるフーリエ変換④〜pythonによるフィルタ設計〜

画像処理におけるフーリエ変換の最終回として、pythonによるフィルタ設定についてご紹介します。

この記事のキーワード

この記事のキュレーター

Mochizuki Mochizuki