画像の平均輝度を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
via imacel.net
画像を歪める
画像を回転させたり、反転させたりするのは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関数によって画像を変換しています。
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関数によって画像を変換しています。