vimageのススメ(改訂版)
TRANSCRIPT
![Page 1: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/1.jpg)
vImageのススメ(改訂版)
@shu223
1
![Page 2: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/2.jpg)
自己紹介
•面白法人カヤック勤務• Twitter @shu223• Blog 『Over&Outその後』
2
![Page 3: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/3.jpg)
最近つくったアプリタップ忍者
モンスターを集めてまいれ!2
モンスターを集めてまいれ!
3
![Page 4: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/4.jpg)
アジェンダ
• vImageとは?•何がいいの?•使用例•その他諸々
4
![Page 5: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/5.jpg)
vImageとは?• Accelerate.framework内のライブラリ• iOSデバイスのハードウェア向けに最適化されていて高速
• 畳み込みや幾何変換,ヒストグラム計算などの画像処理系の関数をまとめたもので,iOS5から利用可能
5
![Page 6: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/6.jpg)
何がいいの?
•シンプルに書ける!•速い!•省電力!
6
![Page 7: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/7.jpg)
畳み込み演算
• 各種画像処理のコアとなる処理
• カーネルサイズと画素数に応じて処理量が指数関数的に増大するカーネルサイズ7x7、解像度2448x3264の場合、演算回数は3億9152万回!
7
![Page 8: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/8.jpg)
何がいいの?
•シンプルに書ける!•速い!•省電力!
8
![Page 9: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/9.jpg)
シンプルに書ける! 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; }}
•このままだとものすごく遅い!•実際には、端部の処理とかオーバーフローの処理とかも必要•ちゃんと書くと数百行に!!
9
![Page 10: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/10.jpg)
シンプルに書ける! 2/2
• vImageを利用した畳み込み演算のコードvImageConvolve_ARGB8888(source, dest, NULL, 0, 0, kernel, kernelHeight, kernelWidth, divisor, NULL, flags );
•コードがシンプルに!•もちろん端部処理とかオーバーフローの処理は内部でやってくれてる
10
![Page 11: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/11.jpg)
何がいいの?
•シンプルに書ける!•速い!•省電力!
11
![Page 12: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/12.jpg)
14倍高速!!
12
![Page 13: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/13.jpg)
何がいいの?
•シンプルに書ける!•速い!•省電力!
13
![Page 14: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/14.jpg)
90%の節電 !!
14
![Page 15: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/15.jpg)
vImageの使い方• Accelerateフレームワークをプロジェクトに追加し、Accelerate.hをインポートすればOK
• とりあえずvImageConvolve_ARGB8888() ひとつで色々できる
vImageConvolve_ARGB8888(source, dest, NULL, 0, 0, kernel, kernelHeight, kernelWidth, divisor, NULL, flags );
第5引数の “kernel” に渡す配列によって様々なフィルタを実現できる
15
![Page 16: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/16.jpg)
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};
16
![Page 17: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/17.jpg)
static int16_t emboss_kernel[9] = {! -2, 0, 0, ! 0, 1, 0, ! 0, 0, 2};
vImageConvolve使用例エンボス
17
![Page 18: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/18.jpg)
static int16_t sharpen_kernel[9] = {! -1, -1, -1, ! -1, 9, -1, ! -1, -1, -1};
vImageConvolve使用例先鋭化
18
![Page 19: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/19.jpg)
回転vImageRotate_ARGB8888(&src, &dest, NULL, radians, bgColor, kvImageBackgroundColorFill);
19
![Page 20: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/20.jpg)
膨張vImageDilate_ARGB8888(&src, &dest, 0, 0, morphological_kernel, 3, 3, kvImageCopyInPlace);
20
![Page 21: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/21.jpg)
収縮vImageErode_ARGB8888(&src, &dest, 0, 0, morphological_kernel, 3, 3, kvImageCopyInPlace);
21
![Page 22: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/22.jpg)
ヒストグラム均一化vImageEqualization_ARGB8888(&src, &dest, kvImageNoFlags);
22
![Page 23: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/23.jpg)
サンプルコード
• https://github.com/shu223/vImageDemo
• vImageで実現可能な処理をUIImageのカテゴリとして実装してあります
• コード例imageView.image = [image emboss];
23
![Page 24: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/24.jpg)
サンプル適用例
24
![Page 25: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/25.jpg)
サンプル適用例
25
![Page 26: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/26.jpg)
vs CoreImage / OpenCV
vImage CoreImage OpenCV
導入しやすさ
機能の豊富さ
処理速度
情報量
◎ ◎ ×
△ ? ◎
要検証(※)要検証(※)要検証(※)
× △ ○(※)・CoreImageもvImageもハードウェアアクセラレーションを行っているはず。・OpenCVはNVidia CUDAランタイムを利用しているのでNVidiaのGPUが必要 (http://opencv.jp/opencv-2svn/cpp/gpu_gpu_module_introduction.html)・速度面でいえばシェーダで書いてOpenGLESで処理する場合との比較も必要
26
![Page 27: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/27.jpg)
ドキュメント• WWDC2011のセッションビデオ&スライド• 概要を知るには一番わかりやすい• vImage Programming Guide• 処理前後のサンプル画像や、フィルタ配列の図もあってわかりやすい
• vImageリファレンス• たくさんあるので必要に応じてどうぞ・・・• Conversion / Convolution / Decompression / Geometry / Histogram / Morphology / Transform etc...
27
![Page 28: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/28.jpg)
vImageを使用している画像処理ライブラリ
• NYXImagesKit• vImage, vDSP, CoreImageを併用• gihyo.jpにて連載中の第3回記事で紹介しました• 『iOSアプリ開発で使いこなしたいとっておきのOSS』• fladdictさんその節はありがとうございました
28
![Page 29: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/29.jpg)
まとめ
iOS5以降で画像処理やるならvImageの使用を検討してみるといいかもしれません!
29
![Page 30: vImageのススメ(改訂版)](https://reader034.vdocuments.pub/reader034/viewer/2022051112/558b0509d8b42a8d0f8b45e5/html5/thumbnails/30.jpg)
ご清聴ありがとうございました
30