惫滨尘补驳别のススメ(改订版)
- 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;
}
}
?このままだとものすごく遅い!
?実際には、端部の処理とかオーバーフローの処理とかも必要
?ちゃんと書くと数百行に!! 9
- 10. シンプルに书ける! 2/2
? vImageを利用した畳み込み演算のコード
vImageConvolve_ARGB8888(source, dest, NULL, 0, 0,
kernel, kernelHeight,
kernelWidth, divisor, NULL,
flags );
?コードがシンプルに!
?もちろん端部処理とかオーバーフローの処理は内部で
やってくれてる
10
- 15. vImageの使い方
? Accelerateフレームワークをプロジェクトに追加し、
Accelerate.hをインポートすればOK
? とりあえずvImageConvolve_ARGB8888() ひとつ
で色々できる
vImageConvolve_ARGB8888(source, dest, NULL, 0, 0,
kernel, kernelHeight,
kernelWidth, divisor, NULL,
flags );
第5引数の kernel に渡す配列によって様々なフィル
タを実現できる
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
};
16
- 17. 惫滨尘补驳别颁辞苍惫辞濒惫别使用例
エンボス
static int16_t emboss_kernel[9] = {
! -2, 0, 0,
! 0, 1, 0,
! 0, 0, 2
};
17
- 18. 惫滨尘补驳别颁辞苍惫辞濒惫别使用例
先鋭化
static int16_t sharpen_kernel[9] = {
! -1, -1, -1,
! -1, 9, -1,
! -1, -1, -1
};
18
- 26. 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
- 27. ドキュメント
? WWDC2011のセッションビデオ&スライド
? 概要を知るには一番わかりやすい
? vImage Programming Guide
? 処理前後のサンプル画像や、フィルタ配列の図も
あってわかりやすい
? vImageリファレンス
? たくさんあるので必要に応じてどうぞ???
? Conversion / Convolution / Decompression /
Geometry / Histogram / Morphology / Transform???
etc...
27
- 28. vImageを使用している
画像処理ライブラリ
? NYXImagesKit
? vImage, vDSP, CoreImageを併用
? gihyo.jpにて連載中の第3回記事で紹介しました
? 『iOSアプリ開発で使いこなしたいとっておきのOSS』
? ?addictさんその節はありがとうございました
28