先日の記事で第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...
- とりあえずvImageConvolve_ARGB8888() ひとつで色々できる
- その他の使い方
- 回転
- 膨張/収縮
- ヒストグラム均一化
- サンプルコード:https://github.com/shu223/vImageCategory
- vImage vs OpenCV vs CoreImage
- ドキュメント
- WWDC2011のセッションビデオ&スライド
- 概要を知るには一番わかりやすい
- vImage Programming Guide
- 処理前後のサンプル画像や、フィルタ配列の図もあってわかりやすい
- vImageリファレンス
- たくさんあるので必要に応じてどうぞ・・・
- Conversion / Convolution / Decompression / Geometry / Histogram / Morphology / Transform etc...
- WWDC2011のセッションビデオ&スライド
- vImageを使用している画像処理ライブラリ
- NYXImagesKit
- vImage, vDSP, CoreImageを併用
- gihyo.jpにて連載中の第3回記事で紹介しました
- 『iOSアプリ開発で使いこなしたいとっておきのOSS』
- NYXImagesKit
サンプルコード
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での処理速度の比較(計測コード書く)
このあたりはまた追って調べたいと思います!