Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
画像フィルタリング高速化するよ@iOS
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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.5k
Liquid Glass を Metal Shader で描きたいだけの人生だった…
temoki
0
300
Skip Skip Run Run Run ♫
temoki
0
1.1k
さようならRxSwift こんにちは*****
temoki
1
670
Androidで不安定なPlatform Viewsとの闘い
temoki
0
1.3k
iOSパッケージマネージャー奮闘記 完結編
temoki
2
800
事業譲渡を受けたアプリとの統合で失敗、 そしてユーザーからの評価回復に至るまで
temoki
1
830
Apple Vision Proデベロッパラボに参加してきた
temoki
0
650
年末年始の成果、そして現状の紹介
temoki
0
340
Other Decks in Programming
See All in Programming
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
720
wkhtmltopdfの次どうするか問題2026
willnet
2
1.6k
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
3
360
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
120
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
250
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
120
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
200
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.2k
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
150
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
260
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
220
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
160
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
570
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
280
Building an army of robots
kneath
307
46k
Leo the Paperboy
mayatellez
10
2.3k
GitHub's CSS Performance
jonrohan
1033
470k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
340
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
940
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);
͓ΘΓ