4
1

More than 5 years have passed since last update.

OpenCVによる画像変換の効果

Last updated at Posted at 2019-05-13

はじめに

 画像解析を実施するためにOpenCVを用いてデータの水増しをする。その前に、OpenCVによる画像変換の効果を画像で確認する。次回、データの水増しを実施する。

OpenCVによる画像変換の効果

  • 画像の取得
import numpy as np
import cv2
img = cv2.imread("./CleansingData/img.jpg")

img.jpg

  • リサイズ

元の1/10の大きさにする。

resize_img = cv2.resize(img,(img.shape[1] // 10, img.shape[0] // 10))

cv2.imwrite("CleansingData/resize_img.jpg", resize_img)

resize_img.jpg

  • モザイク

リサイズで縮小した画像を元のサイズに戻すとモザイクがかかる。

mosaic_img = cv2.resize(resize_img,(img.shape[1], img.shape[0]))

cv2.imwrite("CleansingData/mosaic_img.jpg", mosaic_img)

mosaic_img.jpg

  • 回転

45°回転する。関数の引数は次の表の通り

関数 第一引数 第二引数 第三引数
getRotasionMatrix2D 回転軸の中心を決める 回転させる角度 倍率
warpAffine 加工する画像 変換行列 出力画像のサイズ
mat = cv2.getRotationMatrix2D(tuple(np.array([img.shape[1] / 2, img.shape[0] /2])), 45, 1)
rotation_img = cv2.warpAffine(img, mat, (img.shape[1], img.shape[0]))

cv2.imwrite("CleansingData/rotation_img.jpg", rotation_img)

rotation_img.jpg

  • 反転

flip関数の第二引数で反転の種類を選択する。
反転の仕方はflip関数の第二引数により変更できる。
第二引数の種類は次の表の通り。

第二引数
0 x軸を中心に左右反転
1 y軸を中心に上下反転
-1 両方の軸を中心に反転
flip_img1 = cv2.flip(img, 0)
flip_img2 = cv2.flip(img, 1)
flip_img3 = cv2.flip(img, -1)

cv2.imwrite("CleansingData/flip_img1.jpg", flip_img1)
cv2.imwrite("CleansingData/flip_img2.jpg", flip_img2)
cv2.imwrite("CleansingData/flip_img3.jpg", flip_img3)

flip_img1.jpg
flip_img2.jpg
flip_img3.jpg

  • 色調変換・色反転

cvtColor関数でBGR色空間をLab色空間に変換する。
bitwise関数で色反転する。

cvt_img1 = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
cvt_img2 = cv2.bitwise_not(img)

cv2.imwrite("CleansingData/cvt_img1.jpg", cvt_img1)
cv2.imwrite("CleansingData/cvt_img2.jpg", cvt_img2)

cvt_img1.jpg
cvt_img2.jpg

  • 閾値処理

threshold関数の第二引数を閾値として、これを超えた時に第四引数で与えた処理を行う。第三引数はmxValue。
処理の種類は次の表の通り。

第四引数
THRESH_BINARY 閾値を超えるピクセルはmaxValueに、それ以外のピクセルは0にする
THRESH_BINARY_INV 閾値を超えるピクセルは0に、それ以外のピクセルはmaxValueにする
THRESH_TRUNC 閾値を超えるピクセルは閾値に、それ以外のピクセルは0にする
THRESH_TOZERO 敷地を超えるピクセルは変更せず、それ以外のピクセルは0にする
THRESH_TOZERO_INV 閾値を超えるピクセルは0に、それ以外のピクセルは変更しない
retval, thresh_img1 = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
retval, thresh_img2 = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY_INV)
retval, thresh_img3 = cv2.threshold(img, 100, 255, cv2.THRESH_TRUNC)
retval, thresh_img4 = cv2.threshold(img, 100, 255, cv2.THRESH_TOZERO)
retval, thresh_img5 = cv2.threshold(img, 100, 255, cv2.THRESH_TOZERO_INV)

cv2.imwrite("CleansingData/thresh_img1.jpg", thresh_img1)
cv2.imwrite("CleansingData/thresh_img2.jpg", thresh_img2)
cv2.imwrite("CleansingData/thresh_img3.jpg", thresh_img3)
cv2.imwrite("CleansingData/thresh_img4.jpg", thresh_img4)
cv2.imwrite("CleansingData/thresh_img5.jpg", thresh_img5)

thresh_img1.jpg
thresh_img2.jpg
thresh_img3.jpg
thresh_img4.jpg
thresh_img5.jpg

  • ぼかし

ガウシアンフィルタを用いて画像をぼかす。第二引数はカーネルサイズ。カーネルサイズはn×nでnは奇数。数値が大きいほどぼかしが強くなる。

gauss_img = cv2.GaussianBlur(img, (51, 51), 0)

cv2.imwrite("CleansingData/gauss_img.jpg", gauss_img)

gauss_img.jpg

  • グレースケール

白黒画像にする

gray_img = cv2.imread("./CleansingData/img.jpg", 0)

cv2.imwrite("CleansingData/gray_img.jpg", gray_img)

gray_img.jpg

  • ノイズ除去

カラー画像のノイズ除去と白黒画像のノイズ除去がある。
画像を拡大して元の画像と比較すると違いがわかる、かも。

nois_color_img = cv2.fastNlMeansDenoisingColored(img)
nois_gray_img = cv2.fastNlMeansDenoising(gray_img)

cv2.imwrite("CleansingData/nois_color_img.jpg", nois_color_img)
cv2.imwrite("CleansingData/nois_gray_img.jpg", nois_gray_img)

nois_color_img.jpg
nois_gray_img.jpg

  • 膨張・収縮

膨張はピクセルを中心にフィルタ内の最大値を中心の値に、収縮はその逆にする。フィルタは上下左右の4つと周囲8つがある。下記は周囲8つで実施している。

filt = np.ones((3, 3), np.uint8)
dilate_img = cv2.dilate(img, filt)
erode_img = cv2.erode(img, filt)

cv2.imwrite("CleansingData/dilate_img.jpg", dilate_img)
cv2.imwrite("CleansingData/erode_img.jpg", erode_img)

dilate_img.jpg
erode_img.jpg

おわりに

 OpenCVによる画像変換の効果を確認できた。次回はこれらの方法でデータを水増ししていく。

4
1
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
4
1