はじめに
画像解析を実施するためにOpenCVを用いてデータの水増しをする。その前に、OpenCVによる画像変換の効果を画像で確認する。次回、データの水増しを実施する。
#OpenCVによる画像変換の効果
- 画像の取得
import numpy as np
import cv2
img = cv2.imread("./CleansingData/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)
- モザイク
リサイズで縮小した画像を元のサイズに戻すとモザイクがかかる。
mosaic_img = cv2.resize(resize_img,(img.shape[1], img.shape[0]))
cv2.imwrite("CleansingData/mosaic_img.jpg", mosaic_img)
- 回転
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)
- 反転
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)
- 色調変換・色反転
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)
- 閾値処理
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)
- ぼかし
ガウシアンフィルタを用いて画像をぼかす。第二引数はカーネルサイズ。カーネルサイズはn×nでnは奇数。数値が大きいほどぼかしが強くなる。
gauss_img = cv2.GaussianBlur(img, (51, 51), 0)
cv2.imwrite("CleansingData/gauss_img.jpg", gauss_img)
- グレースケール
白黒画像にする
gray_img = cv2.imread("./CleansingData/img.jpg", 0)
cv2.imwrite("CleansingData/gray_img.jpg", gray_img)
- ノイズ除去
カラー画像のノイズ除去と白黒画像のノイズ除去がある。
画像を拡大して元の画像と比較すると違いがわかる、かも。
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)
- 膨張・収縮
膨張はピクセルを中心にフィルタ内の最大値を中心の値に、収縮はその逆にする。フィルタは上下左右の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)
#おわりに
OpenCVによる画像変換の効果を確認できた。次回はこれらの方法でデータを水増ししていく。