その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

『第3回 iphone_dev_jp 東京iPhone/Mac勉強会』で vImage について発表してきました

先日の記事で第2回勉強会向けに用意していた発表内容について書きましたが、本日(7/21)開催された第3回で発表の機会をいただいたので、資料とサンプルコードをアップデートして発表してきました。


iOS 5 から Accelerate.framework に追加された高速画像処理ライブラリ、vImage についての話です。


前回との差分は、サンプルコードでできる画像処理が増えたこと(回転とか膨張/収縮とか、前回記事のときから倍ぐらい対応メソッドが増えてます)と、資料でそのへんについて触れているp19〜p25あたりと、OpenCV, CoreImageとの比較を表にしたp26あたりです。



資料の内容抜粋

  • vImageとは
    • Accelerate.framework内のライブラリ
    • iOSデバイスのハードウェア向けに最適化されていて高速
    • 畳み込みや幾何変換,ヒストグラム計算などの画像処理系の関数をまとめたものでiOS5から利用可能
  • 何がいいの?
    • シンプルに書ける
    • 速い・・・14倍高速!!
    • 省電力・・・90%off!!
  • vImageの使い方
    • Accelerateフレームワークをプロジェクトに追加し、 Accelerate.hをインポートすればOK
#import <Accelerate/Accelerate.h>
    • とりあえずvImageConvolve_ARGB8888() ひとつで色々できる
      • ブラー、エッジ抽出、エンボス、先鋭化 etc...
  • その他の使い方
    • 回転
    • 膨張/収縮
    • ヒストグラム均一化
  • サンプルコード:https://github.com/shu223/vImageCategory
  • vImage vs OpenCV vs CoreImage
  • ドキュメント
    • WWDC2011のセッションビデオ&スライド
      • 概要を知るには一番わかりやすい
    • vImage Programming Guide
      • 処理前後のサンプル画像や、フィルタ配列の図もあってわかりやすい
    • vImageリファレンス
      • たくさんあるので必要に応じてどうぞ・・・
      • Conversion / Convolution / Decompression / Geometry / Histogram / Morphology / Transform etc...
  • vImageを使用している画像処理ライブラリ

サンプルコード

githubに上げたサンプルコードは UIImage のカテゴリとして作ってあってAPIも下記のようにシンプルにしてあります。

// Convolution Oprations
- (UIImage *)gaussianBlur;
- (UIImage *)edgeDetection;
- (UIImage *)emboss;
- (UIImage *)sharpen;
- (UIImage *)unsharpen;

// Geometric Operations
- (UIImage *)rotateInRadians:(float)radians;

// Morphological Operations
- (UIImage *)dilate;
- (UIImage *)erode;
- (UIImage *)dilateWithIterations:(int)iterations;
- (UIImage *)erodeWithIterations:(int)iterations;
- (UIImage *)gradientWithIterations:(int)iterations;
- (UIImage *)tophatWithIterations:(int)iterations;
- (UIImage *)blackhatWithIterations:(int)iterations;

// Histogram Operations
- (UIImage *)equalization;


実行して画面をタッチするとこんな感じで vImage による画像処理が適用されます。



※左上がオリジナル画像です。


反省など

一番肝心なところの調査が足りず、中途半端な発表をしてしまったなーと反省しております。


何がって、資料p26の vImage vs CoreImage vs OpenCV の部分、あそこで「どういう場合において vImage を選択するべきか」を明確に言えてないので、この発表を聞いたところで vImage を採用しようとか採用しないでおこうとか、判断できないところ。

  • CoreImage は内部的に vImage を使ってるのかどうか。
    • 全面的に使ってるのか、一部で使ってるのか。
  • vImage にできて、CoreImage にできないこと。その逆。
  • vImage, CoreImage, OpenCV, OpenGLESでの処理速度の比較(計測コード書く)


このあたりはまた追って調べたいと思います!