画像処理でのPythonの利用

36,408 views

Published on

Published in: Technology
0 Comments
75 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
36,408
On SlideShare
0
From Embeds
0
Number of Embeds
1,479
Actions
Shares
0
Downloads
208
Comments
0
Likes
75
Embeds 0
No embeds

No notes for slide

画像処理でのPythonの利用

  1. 1. サンプルコード配布:https://github.com/tokyo-scipy/archive/tree/master/004/yasutomo57jp 画像処理でのPythonの利用 @yasutomo57jp 2012/06/16 Tokyo.Scipy #4
  2. 2. 自己紹介名前:川西康友所属:京都大学学術情報メディアセンターPython歴:1年くらい 去年,RubyからPythonへ乗り換え OpenCVの公式サポートがないのが痛い Numpyと比べてNumerical Ruby使ってる人は少な かった… 普段はPython又はC++でプログラミングしていま す こうして喋ってますがPython初心者です
  3. 3. 自己紹介何をやっている人か:研究してます 映像メディアに対する認識など 映像中の人物検出・追跡・照合 o 最近ホットな防犯ネタ 映像からのプライバシ情報の除去
  4. 4. Contents入門編:画像処理にPythonを使う 画像処理ライブラリの紹介 簡単な画像処理の例応用編:Numpy/Scipyを使った応用例 固有空間を用いた物体領域抽出
  5. 5. 入門編:画像処理にPythonを使う
  6. 6. 画像を簡単に処理したいさらさらっと書いて即実行したい色んな環境で動くプログラムを作りたいC++とか使いたくない
  7. 7. 画像処理まわりのPythonPIL(Python Imaging Library) http://www.pythonware.com/library/pil/handbook/index.htmOpenCV http://docs.opencv.org/scipy.ndimage http://docs.scipy.org/doc/scipy/reference/ndimage.html画像を扱うライブラリが充実してきた
  8. 8. PIL : Python Imaging Libraryインストール: $ easy_install pil一番手っ取り早く“画像処理”が出来る 画像の読み書き フォーマット変換 サイズ,解像度変換 各種フィルタ処理 図形の描画
  9. 9. PIL プログラム例画像を読み込んでエッジ検出して回転させて表示して保存import Imageimport ImageFilterimg = Image.open(“lena.jpg”)eimg = img.filter(ImageFilter.FIND_EDGES)reimg = eimg.rotate(45)reimg.show()reimg.save(“lena_edge.jpg”)
  10. 10. OpenCVインストール: http://opencv.jp/download Ubuntuなら sudo apt-get install python-opencv高度な処理が可能! カメラからの入出力 様々な特徴抽出 顔認識 画像処理研究者の多くが利用 (C++での利用が主だと思うが) 画像は numpy.array 形式で扱う shape=(高さ,幅,チャンネル数), dtype=numpy.uint8 です
  11. 11. OpenCV プログラム例 SURF特徴を取り出し,それを基に対応付けimport cv2img1 = Image.open(“lena.jpg”)img2 = Image.open(“lena_rotate.jpg”)surfdetect = cv2.FeatureDetector_create(“SURF”)surfextract = cv2.DescriptorExtractor_create(“SURF”)keys1 = surfdetect.detect(img1)keys2 = surfdetect.detect(img2)keys1, features1 = surfextract.compute(img1, keys1)keys2, features2 = surfextract.compute(img2, keys2)
  12. 12. OpenCV プログラム例 SURF特徴を取り出し,それを基に対応付け(続き)# 対応点を探索dm = cv2.DescriptorMatcher_create(“BruteForce”)match = dm.match(features1,features2)# ↑対応する特徴点のインデックスの組みが入っている# あとは頑張って可視化(省略)# C++なら cv::drawMatchesという関数があるが# Pythonでは見つけられなかった…# 今後実装されるのかもcv2.imshow(“result”, result)cv2.waitKey()
  13. 13. OpenCV プログラム例 Haar-like特徴を使った顔検出#!/usr/bin/env pythonimport cv2cc = cv2.CascadeClassifier()# 学習済みの識別器データを読み込みcc.load("haarcascade_frontalface_alt.xml"):img=cv2.imread("lena.jpg")# 顔検出faces = cc.detectMultiScale(img, 1.1)#あとはfacesを画像に描画すればOK
  14. 14. Scipy.ndimageインストール: $ easy_install scipy使ったことないですが… 各種フィルタ処理 ヒストグラム計算 モルフォロジ処理 どうやら内部でPILを呼んでいるようです
  15. 15. Scipy.ndimage プログラム例略
  16. 16. PILとNumpyの相互変換PIL -> Numpy nimg = numpy.asarray(pimg)Numpy -> PIL pimg = Image.fromarray(nimg)これで PIL/numpy/scipy/OpenCV の関数が自由に利用できる!
  17. 17. ちょっとScipy感が足りない…ので応用編:Numpy/Scipyを使った応用例
  18. 18. 物体領域抽出領域抽出はあらゆる画像処理の基本! 処理対象を画像中から見つける背景差分法 - =観測画像 背景画像 差分画像 画像はPETS 2001 dataset 3のものです
  19. 19. 固有空間を用いたモデル化による手法 観測画像 主成分分析 背景固有空間 背景の変化を 推定した背景画像 モデル化 ・・・時間
  20. 20. 基本的な主成分分析の計算方法各画像(n枚)を1つのベクトル(d次元)にする ラスタスキャンを行うd次元ベクトルの共分散行列(d×d次元)を求める共分散行列の固有値・固有ベクトルを求めるもしくはd次元ベクトルを並べた行列Xを特異値分解しても同じ 詳しくはPRML本12章
  21. 21. 主成分分析のPython実装主成分分析 OpenCV cv2.PCACompute() scikit-learn sklearn.decomposition.PCA()固有値・固有ベクトルの計算(を個別にやる場合) numpy.linalg.eig() scipy.linalg.eig() 注意点:教科書的にはデータxは列ベクトルだけど, プログラム的には行ベクトルで扱う
  22. 22. OpenCV プログラム例# 頑張って各行に画像を入れる (imgvec=numpy.reshape(img,1)を使用)images = load_to_mat(filenames)# PCAする(3次元空間へ)mean, eigenvectors = cv2.PCACompute( images, maxComponents=3)# 背景を推定したい画像img = cv2.imread(“input.bmp”)# 固有空間へ投影vec = cv2.project(img, mean, eigenvectors)# 画像を復元bgimg=cv2.backProject(vec, mean, eigenvectors) あとは img と bgimg を引き算すればOK
  23. 23. 行列がでかすぎて無理と言われます画像は100万画素→300万次元のベクトル 共分散行列は300万^2の大きさに… 計算がメモリ上で不可能になってくる共分散行列を計算しなくてもいいやり方 Dual PCA とか Kernel PCA 画像枚数^2の大きさの行列を処理するだけ
  24. 24. Scikit-learn プログラム例import sklearn.decomposition# 線形カーネルでKernel PCA (たぶんDual PCAと同じ)kpca = sklearn.decomposition.KernelPCA(kernel=“linear", fit_inverse_transform=True)# 1行が1枚の画像になっている行列をもとに学習(とても時間がかかる)kpca.transform(images)# 背景を推定したい画像img = cv2.imread(“input.bmp”).reshape(1)# 固有空間へ投影vec = kpca.transform(img)# 画像を復元bgimg = kpca.inverse_transform(vec)
  25. 25. 物体領域の計算 背景差分法 - = 観測画像 img 背景画像 bimg 差分画像 result# 画像同士の差を取るdiff = cv2.absdiff(img,bimg)# しきい値以上の画素を選択fgmask = diff < threshold# 差分結果の画像を生成result=numpy.zeros(img.shape[0:2], dtype=numpy.uint8)result[ fgmask] = 255
  26. 26. まとめPythonでも画像処理できる! もうPythonだけでいいやん! 画像処理・認識を使ったWebサービス構築も 楽々…のはず!しかし… やっぱり遅い 特にfor文使うと… スピードも欲しければCython使おう http://www.slideshare.net/lucidfrontier45/cython-intro あとPyCUDAとかPyOpenCLとか…

×