狠狠撸

狠狠撸Share a Scribd company logo
惫滨尘补驳别のススメ
   (改訂版)
   @shu223




             1
自己紹介

? 面白法人カヤック勤務
? Twitter @shu223
? Blog 『Over&Outその後』


                       2
最近つくったアプリ
 タップ忍者



 モンスターを集めてまいれ!2




 モンスターを集めてまいれ!


                  3
アジェンダ

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

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

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


                                5
何がいいの?

? シンプルに书ける!
? 速い!
? 省電力!

              6
畳み込み演算

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

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

?シンプルに书ける!
? 速い!
? 省電力!

             8
シンプルに书ける!                                     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
シンプルに书ける!                                     2/2


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


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




                                                       10
何がいいの?

? シンプルに书ける!
?速い!
? 省電力!

              11
14倍高速!!




          12
何がいいの?

? シンプルに书ける!
? 速い!
?省電力!

              13
90%の節電 !!




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

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

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


  第5引数の kernel に渡す配列によって様々なフィル
  タを実現できる
                                                         15
惫滨尘补驳别颁辞苍惫辞濒惫别使用例
               ブラー
 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
惫滨尘补驳别颁辞苍惫辞濒惫别使用例
          エンボス
  static int16_t emboss_kernel[9] = {
  ! -2, 0, 0,
  ! 0, 1, 0,
  ! 0, 0, 2
  };




                                        17
惫滨尘补驳别颁辞苍惫辞濒惫别使用例
             先鋭化
  static int16_t sharpen_kernel[9] = {
  ! -1, -1, -1,
  ! -1, 9, -1,
  ! -1, -1, -1
  };




                                         18
回転
vImageRotate_ARGB8888(&src, &dest,
                      NULL, radians, bgColor,
                      kvImageBackgroundColorFill);




                                                     19
膨張
vImageDilate_ARGB8888(&src, &dest,
                      0, 0,
                      morphological_kernel,
                      3, 3,
                      kvImageCopyInPlace);




                                              20
収縮
vImageErode_ARGB8888(&src, &dest,
                     0, 0,
                     morphological_kernel,
                     3, 3,
                     kvImageCopyInPlace);




                                             21
ヒストグラム均一化
vImageEqualization_ARGB8888(&src, &dest,
                            kvImageNoFlags);




                                               22
サンプルコード

 ? https://github.com/shu223/
   vImageDemo

 ? vImageで実現可能な処理を
   UIImageのカテゴリとして実装して
   あります

  ?   コード例

      imageView.image = [image emboss];




                                          23
サンプル适用例




          24
サンプル适用例




          25
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
ドキュメント
? WWDC2011のセッションビデオ&スライド
 ?   概要を知るには一番わかりやすい

? vImage Programming Guide
 ?   処理前後のサンプル画像や、フィルタ配列の図も
     あってわかりやすい

? vImageリファレンス
 ?   たくさんあるので必要に応じてどうぞ???

     ?   Conversion / Convolution / Decompression /
         Geometry / Histogram / Morphology / Transform???
         etc...

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

? NYXImagesKit
 ? vImage, vDSP, CoreImageを併用
 ? gihyo.jpにて連載中の第3回記事で紹介しました
  ?   『iOSアプリ開発で使いこなしたいとっておきのOSS』

  ?   ?addictさんその節はありがとうございました



                                    28
まとめ

iOS5以降で画像処理やる
ならvImageの使用を検討
してみるといいかもしれま
せん!
                 29
ご清聴ありがとうございました




                 30

More Related Content

惫滨尘补驳别のススメ(改订版)