Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
画像フィルタリング高速化するよ@iOS
Search
Tomoki Kobayashi
July 30, 2016
Programming
150
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
画像フィルタリング高速化するよ@iOS
Tomoki Kobayashi
July 30, 2016
More Decks by Tomoki Kobayashi
See All by Tomoki Kobayashi
Ruby×iOSアプリ開発 ~共に歩んだエコシステムの物語~
temoki
0
3.2k
Liquid Glass を Metal Shader で描きたいだけの人生だった…
temoki
0
230
Skip Skip Run Run Run ♫
temoki
0
1k
さようならRxSwift こんにちは*****
temoki
1
610
Androidで不安定なPlatform Viewsとの闘い
temoki
0
1.2k
iOSパッケージマネージャー奮闘記 完結編
temoki
2
750
事業譲渡を受けたアプリとの統合で失敗、 そしてユーザーからの評価回復に至るまで
temoki
1
800
Apple Vision Proデベロッパラボに参加してきた
temoki
0
620
年末年始の成果、そして現状の紹介
temoki
0
320
Other Decks in Programming
See All in Programming
FDEが実現するAI駆動経営の現在地
gonta
2
200
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
150
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.6k
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
390
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
120
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
540
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
1k
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
160
関数型プログラミングのメリットって何だろう?
wanko_it
0
190
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.7k
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
210
Foundation Models frameworkで画像分析
ryodeveloper
1
130
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Are puppies a ranking factor?
jonoalderson
1
3.7k
Skip the Path - Find Your Career Trail
mkilby
1
170
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
260
Git: the NoSQL Database
bkeepers
PRO
432
67k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.9k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
Designing for Timeless Needs
cassininazir
1
390
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
370
GitHub's CSS Performance
jonrohan
1033
470k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Transcript
ը૾ϑΟϧλϦϯά ߴԽ͢ΔΑˏJ04 !UFNPLJ
ը૾ϑΟϧλϦϯάͬͯԿʁ ը૾ϑΟϧλϦϯάͷ࣮ ը૾ϑΟϧλϦϯάΛߴԽʂ
ը૾ϑΟϧλϦϯάͬͯԿʁ ը૾ϑΟϧλϦϯάͷ࣮ ը૾ϑΟϧλϦϯάΛߴԽʂ
͜ͷϨφ͞ΜࣸਅΛ
΅͔ͨ͠Γ
ྠֲͱΓͩͨ͠Γ
ϞβΠΫ ͔͚ͨΓ ͢ΔͭͰ͢ ը૾αϯϓϧʮϨφʯͷਖ਼ମʮ1-":#0:ʯࢽͷ ࠷ଟൢച෦Λهͨ͠ϓϨΠϝΠτ IUUQHJHB[JOFOFUOFXT@MFOOB
ը૾ϑΟϧλϦϯάͬͯԿʁ ը૾ϑΟϧλϦϯάͷ࣮ ը૾ϑΟϧλϦϯάΛߴԽʂ
Ұൠతͳը૾σʔλ
QJYFM 3(#"
QJYFM 3FE(SFFO#MVF"MQIB νϟϯωϧʹόΠτʹdͷ ܭνϟϯωϧʹόΠτ
ը૾શମ 3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#" 3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#" 3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#" 3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#" 3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#" 3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#" 3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#" 3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#" 3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#" 3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#" 3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#" 3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#" 3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#" 3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
ΈࠐΈԋࢉ
ΈࠐΈΧʔωϧ
ೖྗը૾ ग़ྗ º º º º º º º º º × º
ΈࠐΈΧʔωϧ $POWPMVUJPO,FSOFM
ྫ͑ɺ
΅͔͠ʢҠಈฏۉʣ
΅͔͠ʢՙॏฏۉʣ
Τοδநग़ʢਫฏʣ
Τοδநग़ʢਨʣ
ઌӶԽ
αΠζ͍Ζ͍Ζ
ΨγΞϯΧʔωϧº
˞ઌ΄Ͳͷʮ΅͔͠ʢՙॏฏۉʣʯͱಉ͡
ΨγΞϯΧʔωϧº
ΨγΞϯΧʔωϧº
ܭࢉྔ
for ( x of image ) { for ( y
of image ) { for ( x of kernel ) { for ( y of kernel ) { for ( channel ) { operation } } } } }
ສճͷԋࢉ w ೖྗը૾ɿ3(#"Y w ΧʔωϧɿΨγΞϯΧʔωϧº w ºººº
ॲཧ࣌ؒ
͜ΜͳΞϓϦ ͭͬͯ͘ݕূ
'14 w σόΠεɿJ1IPOF w ೖྗը૾ɿ3(#"Y w ΧʔωϧɿΨγΞϯΧʔωϧº
͑ͨΜ͡Όͳ͍ʜ
ը૾ϑΟϧλϦϯάͬͯԿʁ ը૾ϑΟϧλϦϯάͷ࣮ ը૾ϑΟϧλϦϯάΛߴԽʂ
ߴԽ w ΞϧΰϦζϜͷͰܭࢉྔΛݮΒ͢ w σόΠεͷܭࢉࢿݯΛ࠷େݶʹར༻
ߴԽ w ΞϧΰϦζϜͷͰܭࢉྔΛݮΒ͢ w σόΠεͷܭࢉࢿݯΛ࠷େݶʹར༻ ˠͪ͜Β͕͜ͷεϥΠυͷςʔϚͰ͢ɻ
ϚϧνίΞ w ը૾ΛෳͷΤϦΞʹׂ͢Δ ʢྫʣը૾ͷࠨͷӈ w σόΠεͷίΞεϨουΛ࡞͠ ֤εϨουʹΤϦΞΛׂΓͯΔ
ˣ'14ˣ w J1IPOFίΞˠεϨου w εϨουॲཧ($%Ͱ؆୯ʹ w εϨουͷΦʔόʔϔου͕େ͖͍ʁ ͬͱ͕ΜΕΔͣʜ w ͞ΕͲίΞͰخ͠͞ബ͍
4*.% w 4JOHMF*OTUSVDUJPO.VMUJQMF%BUB w ͷ໋ྩͰෳͷσʔλΛԋࢉ w ϕΫτϧԋࢉɺύοΫυԋࢉ w $16ͷ֦ு໋ྩͱͯ͠ Yͷ..944&
"3.ͷ/&0/
ී௨ͷࢉ int a[4] = { 1, 2, 3, 4 };
int b[4] = { 5, 6, 7, 8 }; int c[4]; for ( int i=0; i<4; i++) { c[i] = a[i] * b[i]; }
"3./&0/Ͱࢉ ʢίϯύΠϥΈࠐΈؔʣ int32_t a = { 1, 2, 3, 4
}; int32_t b = { 5, 6, 7, 8 }; int32_t c; c = vmulq_s32( a, b ); IUUQXXXBSNDPNKBQSPEVDUTQSPDFTTPSTUFDIOPMPHJFTOFPOQIQ
ˢ'14ˢ w গ͘͠ͳͬͨʁ w ॲཧΛ࠷దԽ͢Εͬͱ͍͚Δʁ
ͦͯ͠ɺϝχʔίΞ
ϚϧνίΞ $PSF $PSF $PSF $PSF γϯάϧίΞ $PSF ϝχʔίΞ
ϝχʔίΞ w େྔͷίΞΛ࣋ͭϓϩηοαͰܭࢉ w (16/7*%*" ".% *OUFM *NBHJOBUJPO w *OUFM9FPO1IJ
(16Ͱը૾ॲཧ!J04 w J1IPOFͷ(161PXFS73 w $PSF*NBHFGSBNFXPSLͷ$*'JMUFS w "DDFMFSBUFGSBNFXPSLͷW*NBHF w 0QFO$-ʢJ04Ͱ͍ʹͳΒͳ͍ʣ w
0QFO(-(-4-Ͱ͕ΜΔʢ໘ʜʣ 6*&WPMVUJPOதౡ૱ࢯͷ7JEFP4IBEFSΞϓϦ(16*NBHFϥΠϒϥϦ(-4-Ͱ͕Μͬͯ·͢
$*'JMUFS ˢˢ'14ˢˢ ʂ CIImage * src = [CIImage imageWithCVPixelBuffer:imageBuffer]; CIFilter
* filter = [CIFilter filterWithName:@"CIGaussianBlur"]; [filter setValue:src forKey:@"inputImage"]; [filter setValue:[NSNumber numberWithFloat:1.f] forKey:@"inputRadius"]; CIImage * dst = filter.outputImage; ˞ΧʔωϧαΠζ͕ෆ໌ͷͨΊຊདྷൺֱ͖͢Ͱͳ͍͕ʜ
W*NBHF ˢˢˢ'14ˢˢˢ രʂ const vImage_Buffer src = { CVPixelBufferGetBaseAddress(buffer), height,
width, bytesPerRow }; const vImage_Buffer dst = { malloc(bufferSize), height, width, bytesPerRow }; Pixel_8888 backgroundColor = {0,0,0,0}; vImageConvolve_ARGB8888(&src, &dst, NULL, 0, 0, gaussianKernel, 7, 7, divisor, backgroundColor, kvImageCopyInPlace);
(16͏Ͱ͠ΐʂ
ͪͳΈʹ0QFO$7 ˠ'14 w ී௨ʹ$16Ͱԋࢉ w $6%"࣮͕͋ΔΒ͍͠HQV(QV.BU w 0QFO$-࣮͕͋ΔΒ͍͠PDM.BU cv::Mat src
= cv::Mat(height, width, CV_8UC4, baseAddress); cv::Mat dst = cv::Mat(height, width, CV_8UC4); cv::Size kernelSize(7, 7); cv::GaussianBlur(src, dst, kernelSize, 1.f);
͓ΘΓ