2024年3月12日 更新

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

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

91,972 view お気に入り 1
画像の平均輝度を64に、輝度値の標準偏差を16に揃えています。画像の平均はmean関数で、標準偏差はstd関数で求まるので、元画像から平均輝度値を引いて標準偏差で割った時点で平均0、標準偏差1の画像が出来ます。そこにさらに16をかけて、64を足すことで、画像の平均輝度を64に、輝度値の標準偏差を16に揃えています。

CLAHE

CLAHEと呼ばれる手法もあります。CLAHEはヒストグラムができるだけ均等にバラけるように再配分します。OpenCVで実装されているので簡単に試すことができます。
import numpy as np
import cv2

img = cv2.imread('src.png',0)

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)

cv2.imwrite('dst.jpg',cl1)
clahe.py

ノイズを加える

ごま塩ノイズと呼ばれるノイズを加えてみます。画像の中のランダムな位置に黒(ごま)と白(塩)を撒くイメージです。次のようなコードで実現できます。
img = cv2.imread("a.png", 1)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()

row,col,ch = img.shape

# 白
pts_x = np.random.randint(0, col-1 , 1000) #0から(col-1)までの乱数を千個作る
pts_y = np.random.randint(0, row-1 , 1000)
img[(pts_y,pts_x)] = (255,255,255) #y,xの順番になることに注意

# 黒
pts_x = np.random.randint(0, col-1 , 1000)
pts_y = np.random.randint(0, row-1 , 1000)
img[(pts_y,pts_x)] = (0,0,0)

plt.imshow(img)
plt.show()
saltpepper.py
 (4337)

画像を歪める

画像を回転させたり、反転させたりするのはOpenCVを使えば簡単にできます。
src = cv2.imread("img.jpg", 1)
horizontal_flip = cv2.flip(src, 1) #水平方向に反転
vertical_flip = cv2.flip(src, 0) #垂直方向に反転
flip.py
今回はもっと複雑な変形をやってみたいと思います。

透視変換

正方形を任意の四角形に変形する一次変換のことです。アフィン変換は三角形を変形するときに使いますが、これのさらに一つ上の概念が透視変換です。次に紹介するコードでは正方形の入力画像を変形させています。

手書き文字の学習画像など、反転を行うのがふさわしくない場合にも使うことができます。
重要な箇所として、

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

ここの箇所がもとの正方形を構成する点と、それらの点が変換後どこに移動するかを指定している部分です。移動前と移動後の点のセットからcv2.getPerspectiveTransform関数によって変換行列を計算し、cv2.warpPerspective関数によって画像を変換しています。
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,359 view
画像の再構成理論〜概要、まとめ〜

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

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

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

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

この記事のキーワード

この記事のキュレーター

Mochizuki Mochizuki