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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
2.9k
Liquid Glass を Metal Shader で描きたいだけの人生だった…
temoki
0
210
Skip Skip Run Run Run ♫
temoki
0
990
さようならRxSwift こんにちは*****
temoki
1
600
Androidで不安定なPlatform Viewsとの闘い
temoki
0
1.1k
iOSパッケージマネージャー奮闘記 完結編
temoki
2
740
事業譲渡を受けたアプリとの統合で失敗、 そしてユーザーからの評価回復に至るまで
temoki
1
790
Apple Vision Proデベロッパラボに参加してきた
temoki
0
610
年末年始の成果、そして現状の紹介
temoki
0
310
Other Decks in Programming
See All in Programming
Contextとはなにか
chiroruxx
1
330
3Dシーンの圧縮
fadis
1
770
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
200
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
170
Vite+ Unified Toolchain for the Web
naokihaba
0
320
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
140
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
550
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
240
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
11
5.7k
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.6k
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
5.3k
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Site-Speed That Sticks
csswizardry
13
1.2k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
950
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
210
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
860
Raft: Consensus for Rubyists
vanstee
141
7.5k
Speed Design
sergeychernyshev
33
1.8k
Mind Mapping
helmedeiros
PRO
1
250
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
How to Talk to Developers About Accessibility
jct
2
230
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);
͓ΘΓ