アスペクト比を変えずに画像縮小

deep learningの学習用素材を集めて学習させるために
アスペクト比を変えずに画像サイズを変換した。
opencvにあるresizeと、空いた領域を0で埋めるzeroを組み合わせて実装する。

  • 画像サイズが縦または横のどちらか一つでも指定サイズより大きかったら、Down Scale (openv resize)
  • 画像は左上に詰めて配置し、余った領域は0で埋める
  • Up Scaleはしない

ソースコード

def resize(src_file, dst_file, width, height):
"""
画像ファイルを与えられたサイズにサイズ変換する関数
アス比は固定、左上に寄せる、余った部分はゼロで埋める

Returns
-------
ret_scale : float
拡大/縮小した倍率
"""

src_img = cv2.imread(src_file)
h, w, c = src_img.shape
# dst_img = cv2.resize(src_img, dsize=(width, height))

# アス比固定, padding
scale_w = width / w
scale_h = height / h

ret_scale = 1.0
# Down Convert
if(scale_w < 1.0 or scale_h < 1.0):
if(scale_w < scale_h): 
resize_img = cv2.resize(src_img, dsize=None, fx=scale_w, fy=scale_w, interpolation = cv2.INTER_AREA)
ret_scale = scale_w
else:
resize_img = cv2.resize(src_img, dsize=None, fx=scale_h, fy=scale_h, interpolation = cv2.INTER_AREA)
ret_scale = scale_h
else:
resize_img = src_img

# dst_img 生成
dst_img = np.zeros((height, width, 3), dtype = np.uint8)

# dst_imgにresize_imgを合成
top = 0
left = 0
#dst_img[top:height + top, left:width + left] = resize_img
h, w, c = resize_img.shape
dst_img[0:h, 0:w] = resize_img

cv2.imwrite(dst_file, dst_img)

return ret_scale

実行結果の画像

480x270に変換した。
黒くなっているところが0埋めした場所。
どの画像も固定サイズになり、左上に詰めれていることがわかる。

f:id:skattun:20190414181754j:plainf:id:skattun:20190414181713j:plainf:id:skattun:20190414181657j:plain

pythonで特定のディレクトリから画像ファイルのリストを取得(拡張子で判別)

pythonで特定のディレクトリから画像ファイルのリストを取得する。
画像ファイルかどうかは拡張子で判定、今回は.jpg, .png, .bmpを画像ファイルとする(大文字小文字は区別しない)

# 正規表現でディレクトリから画像ファイルのリストを取得
import os
import re

path = "data/"
pattern = ".*\.(jpg|png|bmp)"
files = [f for f in os.listdir(path) if re.search(pattern, f, re.IGNORECASE)] # 大小文字無視
print(files)

結果
['001.png', '002.png', '003.png']

globでは正規表現が使えないため、少し遠回りする形になった。

python + opencv で画像を回転 rev2

前回の記事は以下

skattun.hatenablog.jp


前回はdst画像の背景が黒くなっていたので、alphaチャンネルを使って
背景透過にしたrev2を用意

import numpy as np
import cv2

# 画像読み込み(alphaチャンネル有り)
src_mat = cv2.imread("001.png", cv2.IMREAD_UNCHANGED)
print(src_mat.shape) # 32,32,4

# 画像サイズの取得(横, 縦)
size = tuple([src_mat.shape[1], src_mat.shape[0]])

# dst 画像用意
dst_mat = np.zeros((size[1], size[0], 4), np.uint8)

# 画像の中心位置(x, y)
center = tuple([int(size[0]/2), int(size[1]/2)])

# 回転させたい角度(正の値は反時計回り)
angle = -45.0

# 拡大比率
scale = 1.0

# 回転変換行列の算出
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)

# アフィン変換
img_dst = cv2.warpAffine(src_mat, rotation_matrix, size, dst_mat,
                         flags=cv2.INTER_LINEAR,
                         borderMode=cv2.BORDER_TRANSPARENT)

# 表示
cv2.imwrite("dst.png", img_dst)

src
f:id:skattun:20170219183609p:plain

dst
f:id:skattun:20170219213417p:plain


背景透過のアルファチャンネル付きになった。

python + opencv で画像を回転

python + opencvのアフィン変換を使って画像を回転

 

import numpy as np
import cv2

# 画像読み込み
img_src = cv2.imread("001.png")

# 画像サイズの取得(横, 縦)
size = tuple([img_src.shape[1], img_src.shape[0]])

# 画像の中心位置(x, y)
center = tuple([int(size[0]/2), int(size[1]/2)])

# 回転させたい角度(正の値は反時計回り)
angle = -45.0

# 拡大比率
scale = 1.0

# 回転変換行列の算出
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)

# アフィン変換
img_rot = cv2.warpAffine(img_src, rotation_matrix, size, flags=cv2.INTER_CUBIC)

# 表示
cv2.imshow("Show ROTATION Image", img_rot)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

src

f:id:skattun:20170219183609p:plain

 

dst

f:id:skattun:20170219183900p:plain

 

参考にしたサイト:

Python OpenCV3で画像のアフィン変換(中心を指定した回転) | from umentu import stupid

画像の幾何学変換 — opencv 2.2 documentation

python3でopencv3をインストール

python始めました。

 

opencvを使いたかったのでインストール

opencv3.0からpython3を始めとするサポート環境が増えるようです。

OpenCVとは? 最新3.0の新機能概要とモジュール構成 - Build Insider

 

C#も公式サポートして欲しい。現在の非公式ライブラリだと使える関数が限られます。

以前C#OpenCV使った時はFFTが出来なくて、途中からOpenCV処理部をC++で書き直す事になりました。だが今はどうでもいいですね。

 

pythonの環境は以下の通り。

pyenv

pyenv 1.0.6

 

pyenv global

anaconda3-4.2.0

 

以下を実行

conda install --channel https://conda.anaconda.org/menpo opencv3

 

動作確認

# test.py

import numpy as np
import cv2

# 画像読み込み
img = cv2.imread("001.png")
cv2.imshow("color", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

お手軽!