1
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?