この記事では、PythonでリストとNumPy配列で画像処理した場合の処理速度を比較してみたので紹介します。
画像処理の処理時間
Pythonで大量のデータを扱う場合、処理速度の面でNumPyなどの数値計算ライブラリを使ったほうが良いと言われています。
今回は、440×450の画像の2値化を例に、実際にリストとNumPyで実装して処理速度を比較してみました。
ソースコード
サンプルプログラムのソースコードです。
NumPy配列
# -*- coding: utf-8 -*-
import numpy as np
from scipy import ndimage
import matplotlib.pyplot as plt
import time
def main():
# 入力画像をグレースケールで読み込み
img = ndimage.imread('input.jpg', mode='L')
# 処理開始時間の計測
start = time.time()
# 2値化
img[img<160] = 0
img[img>=160] = 255
# 処理終了時刻の計測
end = time.time()
# 処理時間(終了時刻-開始時刻)の表示
print (end-start, "[sec]") # 0.00099945068359375 [sec]
if __name__ == "__main__":
main()
リスト
# -*- coding: utf-8 -*-
import numpy as np
from scipy import ndimage
import time
def main():
# 入力画像をグレースケールで読み込み
img = ndimage.imread('input.jpg', mode='L')
# NumPy型 → リスト型に変換
img = img.tolist()
# 処理開始時間の計測
start = time.time()
# 2値化処理
for x in range(0, len(img[0])):
for y in range(0, len(img)):
if img[y][x] > 160:
img[y][x] = 255
else:
img[y][x] = 0
# 処理終了時刻の計測
end = time.time()
# 処理時間(終了時刻-開始時刻)の表示
print (end-start, "[sec]") # 0.06704449653625488 [sec]
if __name__ == "__main__":
main()
実行結果
結果は以下の通りになりました。
■実行環境
| 項目 | 説明 |
|---|---|
| 入力画像 | グレースケール画像(440×450[px]) |
| OS | Windows10 Home Premium 64bit |
| メモリ容量 | 4GB |
| CPU | Core i3-2330M 2.20GHz |
| ソースコード | 【Python】リスト型とNumPy型の処理速度比較 |
■結果
| – | 処理速度[ms] |
|---|---|
| Python+リスト | 67.04449653625488 |
| Python+NumPy | 0.99945068359375 |
リストが約67[ms]、NumPyが約1[ms]と約67倍も処理速度が高速化されています。
おすすめ記事
PythonでOpenCV入門 サンプル集
【Python】画像処理プログラミング入門
【画像処理入門】アルゴリズム&プログラミング

コメント