1
6

More than 5 years have passed since last update.

OpenCVによるデータの水増し(for文)

Last updated at Posted at 2019-05-14

はじめに

 画像解析を実施するために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枚

水増しした画像の一例

  • 元画像
    img.jpg

  • モザイク
    img5.jpgimg6.jpg
    img7.jpgimg8.jpg

  • 回転
    img9.jpgimg10.jpg
    img11.jpgimg12.jpg

  • THRESH_BINARY_INV
    img22.jpgimg23.jpg
    img24.jpgimg25.jpg

  • ぼかし
    img38.jpgimg39.jpg
    img40.jpgimg41.jpg

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)

おわりに

 画像の水増しができた。しかし、プログラムが長すぎる。
次回は本文の短縮にトライする。

1
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
6