はじめに
画像解析を実施するためにOpenCVを用いてデータの水増しをする。OpenCVによる画像処理の効果はOpenCVによる画像処理の効果にて確認した。今回はそれらの方法を用いてデータを水増しする。
プログラムの短縮版はこちら
OpenCVによるデータの水増し(lambda)
手順
画像処理の種類と条件、水増しの量を次の表の通りとする。表の中身をリストとして本文に記述し、
for文でループさせる。合計48枚の画像を水増しする。記述の方法は可読性を重視し、for文によるループをメインとする。※無名関数を用いることでより簡便に記述することができる、はず。
画像処理の種類 | 条件 | 水増しの量 |
---|---|---|
リサイズ | 1/2、1/3、1/5、1/7倍 | 4枚 |
モザイク | 1/3、1/5、1/7、1/10倍 | 4枚 |
回転 | 45、135、225、270° | 4枚 |
反転 | x軸中心、y軸中心、両方 | 3枚 |
色調変換 | - | 1枚 |
色変換 | - | 1枚 |
THRESH_BINARY | 閾値50、100、150、200 | 4枚 |
THRESH_BINARY_INV | 閾値50、100、150、200 | 4枚 |
THRESH_TRUNC | 閾値50、100、150、200 | 4枚 |
THRESH_TOZERO | 閾値50、100、150、200 | 4枚 |
THRESH_TOZERO_INV | 閾値50、100、150、200 | 4枚 |
ぼかし | カーネルサイズ11×11、31×31、51×51、71×71 | 4枚 |
グレースケール | - | 1枚 |
ノイズ除去 | color、gray | 2枚 |
膨張 | フィルター周囲4つ、8つ | 2枚 |
収縮 | フィルター周囲4つ、8つ | 2枚 |
合計 | - | 48枚 |
水増しした画像の一例
OpenCVによるデータの水増し
画像検索条件を調整することでお好きなように画像変換ができる。
import numpy as np
import cv2
#画像変換条件
filter1 = np.array([[0, 1, 0],
[1, 0, 1],
[0, 1, 0]], np.uint8)
filter2 = np.ones((3, 3))
list_resize = [2, 3, 5, 7]
list_mosaic = [3, 5, 7, 10]
list_rotation = [45, 135, 225, 315]
list_flip = [0, 1, -1]
list_cvt1 = [0]
list_cvt2 = [0]
list_THRESH_BINARY = [50, 100, 150, 200]
list_THRESH_BINARY_INV = [50, 100, 150, 200]
list_THRESH_TRUNC = [50, 100, 150, 200]
list_THRESH_TOZERO = [50, 100, 150, 200]
list_THRESH_TOZERO_INV = [50, 100, 150, 200]
list_gauss = [11, 31, 51, 71]
list_gray = [0]
list_nois_gray = [0]
list_nois_color = [0]
list_dilate = [filter1, filter2]
list_erode = [filter1, filter2]
#水増し画像の合計
list_sum =len(list_resize) + len(list_mosaic) + len(list_rotation) + len(list_flip) + len(list_cvt1) + len(list_cvt2) + \
len(list_THRESH_BINARY) + len(list_THRESH_BINARY_INV) + len(list_THRESH_TRUNC) + len(list_THRESH_TOZERO) + \
len(list_THRESH_TOZERO_INV) + len(list_gauss) + len(list_gray) + len(list_nois_gray) + len(list_nois_color) + \
len(list_dilate) + len(list_erode)
print("合計:{}枚".format(list_sum))
#画像タイトル用ナンバーの初期化
num = 0
#水増しの実行と保存
def save(cnv_img):
cv2.imwrite("CleansingData/img" + str(num) + ".jpg", cnv_img)
img = cv2.imread("./CleansingData/img.jpg")
for i in list_resize:
num += 1
cnv_img = cv2.resize(img, (img.shape[1] // i, img.shape[0] // i))
save(cnv_img)
for i in list_mosaic:
num +=1
cnv_img = cv2.resize(img, (img.shape[1] // i, img.shape[0] // i))
cnv_img = cv2.resize(cnv_img, (img.shape[1],img.shape[0]))
save(cnv_img)
for i in list_rotation:
num += 1
mat = cv2.getRotationMatrix2D(tuple(np.array([img.shape[1] / 2, img.shape[0] /2])), i, 1)
cnv_img = cv2.warpAffine(img, mat, (img.shape[1], img.shape[0]))
save(cnv_img)
for i in list_flip:
num += 1
cnv_img = cv2.flip(img, i)
save(cnv_img)
for i in list_cvt1:
num += 1
cnv_img = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
save(cnv_img)
for i in list_cvt2:
num += 1
cnv_img = cv2.bitwise_not(img)
save(cnv_img)
for i in list_THRESH_BINARY:
num += 1
retval, cnv_img = cv2.threshold(img, i, 255, cv2.THRESH_BINARY)
save(cnv_img)
for i in list_THRESH_BINARY_INV:
num += 1
retval, cnv_img = cv2.threshold(img, i, 255, cv2.THRESH_BINARY_INV)
save(cnv_img)
for i in list_THRESH_TRUNC:
num += 1
retval, cnv_img = cv2.threshold(img, i, 255, cv2.THRESH_TRUNC)
save(cnv_img)
for i in list_THRESH_TOZERO:
num += 1
retval, cnv_img = cv2.threshold(img, i, 255, cv2.THRESH_TOZERO)
save(cnv_img)
for i in list_THRESH_TOZERO_INV:
num += 1
retval, cnv_img = cv2.threshold(img, i, 255, cv2.THRESH_TOZERO_INV)
save(cnv_img)
for i in list_gauss:
num += 1
cnv_img = cv2.GaussianBlur(img, (i, i), 0)
save(cnv_img)
for i in list_gray:
num += 1
cnv_img = cv2.imread("./CleansingData/img.jpg", 0)
save(cnv_img)
for i in list_nois_gray:
num += 1
cnv_img = cv2.fastNlMeansDenoising(cnv_img)
save(cnv_img)
for i in list_nois_color:
num += 1
cnv_img = cv2.fastNlMeansDenoisingColored(img)
save(cnv_img)
for i in list_dilate:
num += 1
cnv_img = cv2.dilate(img, i)
save(cnv_img)
for i in list_erode:
num += 1
cnv_img = cv2.dilate(img, i)
save(cnv_img)
おわりに
画像の水増しができた。しかし、プログラムが長すぎる。
次回は本文の短縮にトライする。