vimageのススメ

24
vImageのススメ @shu223 1 12526日土曜日

Upload: shuichi-tsutsumi

Post on 05-Jul-2015

6.186 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: vImageのススメ

vImageのススメ@shu223

112年5月26日土曜日

Page 2: vImageのススメ

自己紹介

•面白法人カヤック勤務• Twitter @shu223• Blog 『Over&Outその後』• 1978年5月26日生まれ

212年5月26日土曜日

Page 3: vImageのススメ

最近つくったアプリ

「モンアツ」で検索!(無料)312年5月26日土曜日

Page 4: vImageのススメ

アジェンダ

•vImageとは?•何がいいの?•使用例•その他諸々

412年5月26日土曜日

Page 5: vImageのススメ

vImageとは?•Accelerate.framework内のライブラリ• iOSデバイスのハードウェア向けに最適化されていて高速

• 畳み込みや幾何変換,ヒストグラム計算などの画像処理系の関数をまとめたもので,iOS5から利用可能

512年5月26日土曜日

Page 6: vImageのススメ

何がいいの?

•シンプルに書ける!•速い!•省電力!

612年5月26日土曜日

Page 7: vImageのススメ

畳み込み演算

•各種画像処理のコアとなる処理

• カーネルサイズと画素数に応じて処理量が指数関数的に増大するカーネルサイズ7x7、解像度2448x3264の場合、演算回数は3億9152万回!

712年5月26日土曜日

Page 8: vImageのススメ

何がいいの?

•シンプルに書ける!•速い!•省電力!

812年5月26日土曜日

Page 9: vImageのススメ

シンプルに書ける! 1/2•vImageを利用しない畳み込み演算のコード

for (i=0; i<imageHeight; i++) { for (j=0; j<imageWidth; j++) { int accumulator = 0; for (ik=0; jk<kernelHeight; ik++) { for (jk=0; jk<kernelWidth; jk++) { accumulator += kernel[k][l] * src[i+ik-kernelHeight/2][j+jk-kernelWidth/2]; } } dst[i][j] = accumulator; }}

•このままだとものすごく遅い!•実際には、端部の処理とかオーバーフローの処理とかも必要•ちゃんと書くと数百行に!!

912年5月26日土曜日

Page 10: vImageのススメ

シンプルに書ける! 2/2

•vImageを利用した畳み込み演算のコードvImageConvolve_ARGB8888(source, dest, NULL, 0, 0, kernel, kernelHeight, kernelWidth, divisor, NULL, flags );

•コードがシンプルに!•もちろん端部処理とかオーバーフローの処理は内部でやってくれてる

1012年5月26日土曜日

Page 11: vImageのススメ

何がいいの?

•シンプルに書ける!•速い!•省電力!

1112年5月26日土曜日

Page 12: vImageのススメ

14倍高速!!

1212年5月26日土曜日

Page 13: vImageのススメ

何がいいの?

•シンプルに書ける!•速い!•省電力!

1312年5月26日土曜日

Page 14: vImageのススメ

90%の節電 !!

1412年5月26日土曜日

Page 15: vImageのススメ

vImageの使い方• Accelerateフレームワークをプロジェクトに追加し、Accelerate.hをインポートすればOK

• とりあえずvImageConvolve_ARGB8888() ひとつで色々できる

vImageConvolve_ARGB8888(source, dest, NULL, 0, 0, kernel, kernelHeight, kernelWidth, divisor, NULL, flags );

第5引数の “kernel” に渡す配列によって様々なフィルタを実現できる

1512年5月26日土曜日

Page 16: vImageのススメ

vImageConvolve使用例ブラー

static int16_t gaussianblur_kernel[25] = {! 1, 4, 6, 4, 1, ! 4, 16, 24, 16, 4,! 6, 24, 36, 24, 6,! 4, 16, 24, 16, 4,! 1, 4, 6, 4, 1};

1612年5月26日土曜日

Page 17: vImageのススメ

static int16_t emboss_kernel[9] = {! -2, 0, 0, ! 0, 1, 0, ! 0, 0, 2};

vImageConvolve使用例エンボス

1712年5月26日土曜日

Page 18: vImageのススメ

static int16_t sharpen_kernel[9] = {! -1, -1, -1, ! -1, 9, -1, ! -1, -1, -1};

vImageConvolve使用例先鋭化

1812年5月26日土曜日

Page 19: vImageのススメ

vImageConvolve使用例サンプルコード• https://github.com/shu223/vImageDemo

• vImageConvolve~ひとつで実現可能な処理をUIImageのカテゴリとして実装してあります

• ブラー、エッジ抽出、エンボス、先鋭化 etc...

1912年5月26日土曜日

Page 20: vImageのススメ

• OpenCVもGPUアクセラレーションは行っている。

• が、Mac OSデバイスやiOSデバイスのハードウェアに特化して最適化されたものではないため、(条件を満たしていれば)vImageの方が速いと思われる

• iOS SDKに含まれている、という点で、利用のお手軽さではvImageの方がちょっとだけ勝る

• 上位レイヤーのフィルタの種類とかではOpenCVの方ができることは多いと思われる

• CoreImageとも比較が必要。GPUで処理してて畳み込みのような低レイヤー処理もできたはず。

OpenCV vs vImage

証拠不十分

2012年5月26日土曜日

Page 21: vImageのススメ

ドキュメント• WWDC2011のセッションビデオ&スライド• 概要を知るには一番わかりやすい• vImage Programming Guide• 処理前後のサンプル画像や、フィルタ配列の図もあってわかりやすい

• vImageリファレンス• たくさんあるので必要に応じてどうぞ・・・• Conversion / Convolution / Decompression / Geometry / Histogram / Morphology / Transform   etc...

2112年5月26日土曜日

Page 22: vImageのススメ

vImageを使用している画像処理ライブラリ

•NYXImagesKit• vImage, vDSP, CoreImageを併用• gihyo.jpにて連載中の第3回記事で紹介しました• 『iOSアプリ開発で使いこなしたいとっておきのOSS』• fladdictさんその節はありがとうございました

2212年5月26日土曜日

Page 23: vImageのススメ

まとめ

iOS5以降で画像処理やるならvImageの使用を検討してみるといいかもしれません!

2312年5月26日土曜日

Page 24: vImageのススメ

ご清聴ありがとうございました

2412年5月26日土曜日