狠狠撸

狠狠撸Share a Scribd company logo
惫滨尘补驳别のススメ
                 @shu223




12年5月26日土曜日                1
自己绍介
              ? 面白法人カヤック勤務
              ? Twitter @shu223
              ? Blog 『Over&Outその後』
              ? 1978年5月26日生まれ

12年5月26日土曜日                          2
最近つくったアプリ




              「モンアツ」で検索!(無料)
12年5月26日土曜日                    3
アジェンダ

              ? 惫滨尘补驳别とは?
              ? 何がいいの?
              ? 使用例
              ? その他諸々

12年5月26日土曜日                 4
惫滨尘补驳别とは?
              ? Accelerate.framework内のライブラリ
              ? iOSデバイスのハードウェア向けに最適化
               されていて高速

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


12年5月26日土曜日                                   5
何がいいの?

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

12年5月26日土曜日                 6
畳み込み演算

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

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

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

12年5月26日土曜日                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;
              }
          }

         ?このままだとものすごく遅い!
         ?実際には、端部の処理とかオーバーフローの処理とかも必要
         ?ちゃんと書くと数百行に!!
12年5月26日土曜日                                                               9
シンプルに书ける!                                  2/2


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


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




12年5月26日土曜日                                                    10
何がいいの?

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

12年5月26日土曜日                 11
14倍高速!!




12年5月26日土曜日             12
何がいいの?

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

12年5月26日土曜日                 13
90%の節電 !!




12年5月26日土曜日               14
惫滨尘补驳别の使い方
     ? Accelerateフレームワークをプロジェクトに追加し、
         Accelerate.hをインポートすればOK

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

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


              第5引数の kernel に渡す配列によって様々なフィル
              タを実現できる
12年5月26日土曜日                                                         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
              };




12年5月26日土曜日                                                16
惫滨尘补驳别颁辞苍惫辞濒惫别使用例
                      エンボス
              static int16_t emboss_kernel[9] = {
              ! -2, 0, 0,
              ! 0, 1, 0,
              ! 0, 0, 2
              };




12年5月26日土曜日                                         17
惫滨尘补驳别颁辞苍惫辞濒惫别使用例
                           先鋭化
                static int16_t sharpen_kernel[9] = {
                ! -1, -1, -1,
                ! -1, 9, -1,
                ! -1, -1, -1
                };




12年5月26日土曜日                                            18
惫滨尘补驳别颁辞苍惫辞濒惫别使用例
              サンプルコード
               ? https://github.com/shu223/
                 vImageDemo

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

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



12年5月26日土曜日                                   19
OpenCV vs vImage
              ?   OpenCVもGPUアクセラレーションは行っている。




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



                                      十
                  が速いと思われる




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

              ?

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



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



12年5月26日土曜日                                              20
ドキュメント
              ? WWDC2011のセッションビデオ&スライド
               ?   概要を知るには一番わかりやすい

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

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

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

12年5月26日土曜日                                                               21
惫滨尘补驳别を使用している
                画像処理ライブラリ

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

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



12年5月26日土曜日                                       22
まとめ

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




12年5月26日土曜日           24

More Related Content

惫滨尘补驳别のススメ

  • 1. 惫滨尘补驳别のススメ @shu223 12年5月26日土曜日 1
  • 2. 自己绍介 ? 面白法人カヤック勤務 ? Twitter @shu223 ? Blog 『Over&Outその後』 ? 1978年5月26日生まれ 12年5月26日土曜日 2
  • 3. 最近つくったアプリ 「モンアツ」で検索!(無料) 12年5月26日土曜日 3
  • 4. アジェンダ ? 惫滨尘补驳别とは? ? 何がいいの? ? 使用例 ? その他諸々 12年5月26日土曜日 4
  • 5. 惫滨尘补驳别とは? ? Accelerate.framework内のライブラリ ? iOSデバイスのハードウェア向けに最適化 されていて高速 ? 畳み込みや幾何変換,ヒストグラム計算 などの画像処理系の関数をまとめたもの で,iOS5から利用可能 12年5月26日土曜日 5
  • 6. 何がいいの? ? シンプルに书ける! ? 速い! ? 省電力! 12年5月26日土曜日 6
  • 7. 畳み込み演算 ? 各種画像処理のコアとなる 処理 ? カーネルサイズと画素数に 応じて処理量が指数関数的 に増大する カーネルサイズ7x7、 解像度2448x3264の場合、 演算回数は3億9152万回! 12年5月26日土曜日 7
  • 8. 何がいいの? ?シンプルに书ける! ? 速い! ? 省電力! 12年5月26日土曜日 8
  • 9. シンプルに书ける! 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; } } ?このままだとものすごく遅い! ?実際には、端部の処理とかオーバーフローの処理とかも必要 ?ちゃんと書くと数百行に!! 12年5月26日土曜日 9
  • 10. シンプルに书ける! 2/2 ? vImageを利用した畳み込み演算のコード vImageConvolve_ARGB8888(source, dest, NULL, 0, 0, kernel, kernelHeight, kernelWidth, divisor, NULL, flags ); ?コードがシンプルに! ?もちろん端部処理とかオーバーフローの処理は内部で やってくれてる 12年5月26日土曜日 10
  • 11. 何がいいの? ? シンプルに书ける! ?速い! ? 省電力! 12年5月26日土曜日 11
  • 13. 何がいいの? ? シンプルに书ける! ? 速い! ?省電力! 12年5月26日土曜日 13
  • 15. 惫滨尘补驳别の使い方 ? Accelerateフレームワークをプロジェクトに追加し、 Accelerate.hをインポートすればOK ? とりあえずvImageConvolve_ARGB8888() ひとつ で色々できる vImageConvolve_ARGB8888(source, dest, NULL, 0, 0, kernel, kernelHeight, kernelWidth, divisor, NULL, flags ); 第5引数の kernel に渡す配列によって様々なフィル タを実現できる 12年5月26日土曜日 15
  • 16. 惫滨尘补驳别颁辞苍惫辞濒惫别使用例 ブラー 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 }; 12年5月26日土曜日 16
  • 17. 惫滨尘补驳别颁辞苍惫辞濒惫别使用例 エンボス static int16_t emboss_kernel[9] = { ! -2, 0, 0, ! 0, 1, 0, ! 0, 0, 2 }; 12年5月26日土曜日 17
  • 18. 惫滨尘补驳别颁辞苍惫辞濒惫别使用例 先鋭化 static int16_t sharpen_kernel[9] = { ! -1, -1, -1, ! -1, 9, -1, ! -1, -1, -1 }; 12年5月26日土曜日 18
  • 19. 惫滨尘补驳别颁辞苍惫辞濒惫别使用例 サンプルコード ? https://github.com/shu223/ vImageDemo ? vImageConvolve~ひとつで実現可 能な処理をUIImageのカテゴリとし て実装してあります ? ブラー、エッジ抽出、エンボス、先鋭化 etc... 12年5月26日土曜日 19
  • 20. OpenCV vs vImage ? OpenCVもGPUアクセラレーションは行っている。 分 ? が、Mac OSデバイスやiOSデバイスのハードウェアに特化して最適 化されたものではないため、(条件を満たしていれば)vImageの方 十 が速いと思われる 不 ? iOS SDKに含まれている、という点で、利用のお手軽さではvImage の方がちょっとだけ勝る ? ? 証 多いと思われる 拠 上位レイヤーのフィルタの種類とかではOpenCVの方ができることは CoreImageとも比較が必要。GPUで処理してて畳み込みのような低 レイヤー処理もできたはず。 12年5月26日土曜日 20
  • 21. ドキュメント ? WWDC2011のセッションビデオ&スライド ? 概要を知るには一番わかりやすい ? vImage Programming Guide ? 処理前後のサンプル画像や、フィルタ配列の図も あってわかりやすい ? vImageリファレンス ? たくさんあるので必要に応じてどうぞ??? ? Conversion / Convolution / Decompression / Geometry / Histogram / Morphology / Transform??? etc... 12年5月26日土曜日 21
  • 22. 惫滨尘补驳别を使用している 画像処理ライブラリ ? NYXImagesKit ? vImage, vDSP, CoreImageを併用 ? gihyo.jpにて連載中の第3回記事で紹介しました ? 『iOSアプリ開発で使いこなしたいとっておきのOSS』 ? ?addictさんその節はありがとうございました 12年5月26日土曜日 22
  • 23. まとめ iOS5以降で画像処理やる ならvImageの使用を検討 してみるといいかもしれま せん! 12年5月26日土曜日 23