Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
KOMADORI による対話的画像処理 
TOYOZUMI Kouichi 
@TOYOZUMIKouichi 
FILMASSEMBLER 
Copyright 2014 TOYOZUMI Kouichi and FILMASSEMBLER ...
今日話すこと 
はじめに 
1. これはいったいなんなのか 
2. Mayaka 
3. その他の部品 
4. 実例1 探すのが大変なフィルタの自作 
5. 実例2 媒介変数決定支援 
6. 実例3 アニメーション 
7. その他諸々 
実装の...
KOMADORIの概要 
これはいったいなんなのか 
・単純に言うと「画像処理ライブラリとちょっとしたおまけ」です 
 ・Common Lisp+C(IOのみ) 
・目指すところは「自分用AfterEffects」 
 ・そもそもAfterEf...
KOMADORIの特長(未成部分含む) 
これはいったいなんなのか 
フィルム・映像における「抽象度のスペクトル」 
シーン 
カット 
コマ 
レイヤ 
画像 
画素 
画素成分値(RGBA) 
 自在に上昇下降して操作できる 
・動的プログ...
旭町から来たもうひとつの中核 
Mayaka 
・MayakaはKOMADORIの中心となる画像処理ライブラリ 
 ・Mayaka: A Yet Another Kernel from Asahi-cho 
  ・再帰的頭字語+Plan9: f...
詳細は過去と未来のMeetUpで 
Mayaka 
・画像を画素のリストとしてmapするmap-imageシリーズ 
 ・MagicNumberはmap-videoも持ってた 
  ・当然将来的にはMayakaにも移植予定 
・空間フィルタを実...
最適化ユーティリティ集 
その他の部品 
・L4S 
 ・Common Lisp用の最適化ユーティリティ集 
 ・最適化用マクロや実行時コード生成で多用する部分を抽出 
  ・型宣言つけたりとか 
  ・なんか探してきたりとか 
 ・パッケージ...
画像IO 
その他の部品 
・tsugumi 
 ・これはCで書いてある 
  ・C11だったはず 
   ・blocksとかも使ってる 
  ・CLのバインディングも含んでるけど 
  ・cl-pngだったかな?遅かったので 
 ・ffmpe...
REDPL 
その他の部品 
FILMASSEMBLER 9
REDPL 
その他の部品 
・Read-Eval-Display-Print-Loop 
 ・今はMayakaの中に入ってる 
  ・でもあきらかにライブラリではないので追い出し+名付け予定 
 ・SLIMEの機能使ってる 
FILMASSE...
インターレースの説明用画像 
探すのが大変なフィルタの自作 
・インターレース収録という仕組みを 
 説明するための画像 
・仕組みは単純だがこんな画像を作ってくれる 
 フィルタは知らない 
詳細はfilmassembler.com/arti...
YUV表色系の説明用画像 
探すのが大変なフィルタの自作 
YUV420(4:1:1) 
・YUV表色系という色の表し方を 
 説明するための画像 
・カメラで収録した映像をRGBに 
 変換せず取り出して 
 わかりやすく可視化 
・輝度チャ...
複数のフィルタを適用する際の媒介変数 
媒介変数決定支援 
・複数の媒介変数を調整すると 
 その組み合わせの結果を 
 予測することが難しくなる 
・順番にかけていくと 
 前のフィルタの影響を 
 操作できない 
・基本記憶と経験とカン頼み...
全部のパターンを出力して比較 
媒介変数決定支援 
1.6 1.8 1.6 1.8 
-0.025 -0.025 -0.05 -0.05 
1.05 1.05 1.05 1.05 
1.6 1.8 1.6 1.8 
-0.025 -0.025 ...
全部のパターンを出力して比較 
媒介変数決定支援 
・やり方はいろいろあります 
 ・まあお好みの方法でやればよいかと 
・contact-sheetという関数で画像リストから 
 コンタクトシートを生成できる、はず…… 
(defparame...
全部のパターンを出力して比較 
媒介変数決定支援 
(c-map-image1 *source* 
(typed-lambda ((component-t r g b a)) 
(with-hsb (h s v) r g b 
(with-rg...
全部のパターンを出力して比較 
媒介変数決定支援 
Evaluation took: 
1.825 seconds of real time 
1.833672 seconds of total run time (1.826062 user,...
「あのしょぼい絵でありえないよねーwww」 
アニメーション 
・今年のエイプリルフールにすぐバレる嘘をついた 
 ・事故レベルの出来 
・なぜか信じられる 
 ・大学同期 
 「キャラ設定とか早く公開してほしい」 
 ・後輩女子 
 「よくも...
手書きアニメーションの難しいところ 
アニメーション 
・絵が描けない 
 ・はっきり言ってどうしようもない 
  ・上手い奴は線が滑らかに引ける 
   ・その時点で勝負ついてる 
 ・filmassembler.com/article/dr...
「能書きは良いから黙って絵を描きな」 
アニメーション 
・絵を四枚用意 - さりげなく言ってるがこれ描くのに2日かかった 
・こういうのを「原画」というそうです 
 ・この間に「中割」というのを入れ動きを滑らかにします 
 ・「中割」を入れつ...
機械に頼って必要な中割の枚数を割り出す 
アニメーション 
・まあこんな感じで!! 
(defun original-frame-shot (directory filenames numbers dst) 
(let* ((count (le...
機械に頼って必要な中割の枚数を割り出す 
アニメーション 
・要は各原画とその原画が完全に次の原画に入れ替わるまで 
 何コマ使うかを渡すと、 
 良い感じに合成して全コマ出力してくれるコードです 
・これで気に入った動きになったら、入力に従っ...
KOMADORIでコマ撮り 
アニメーション 
FILMASSEMBLER 23
今後の改修の最優先事項ではありません 
アニメーション 
convert -alpha remove -loop 0 -delay 12.5 ~/Desktop/dst*.png test2.gif 
・今のところMayakaさんがアニメgif...
キェェェェェェアァァァァァァウゴイタァァァァァァァ!!! 
アニメーション 
FILMASSEMBLER 25
キェェェェェェアァァァァァァウゴイタァァァァァァァ!!! 
アニメーション 
これがいいかな→ 
8 1 1 4 
頷き部分は一コマでないと 
速度が出ないのがわかった 
FILMASSEMBLER 26
問題点と解決策を見つける 
アニメーション 
・頷いた後に弾むような反動がないのですごい不自然 
 ・原画一枚増やそう 
・頭変形してるよ!! 
 ・直そう 
FILMASSEMBLER 27
問題点と解決策を見つける 
アニメーション 
・「微妙な動き」が「気色悪い変形」に 
 ・髪の毛をどう動かすか考え切れてなかった 
・追加した原画が時間なかったので変 
・とりあえずこんな感じで使えるのであとは反復 
FILMASSEMBLER...
今回割愛した使用例など 
その他諸々 
・イラスト作るために使ってたりします 
 ・「描く」じゃなくて「作る」の時点でちょっとおかしい 
・他にも簡単な画像分析系とかに使えたりします 
 ・簡単な捏造なら輝度可視化機能とかで見破れます 
・減色...
これ別にxxxってソフト使えばできるじゃん 
その他諸々 
・ほとんどにおいて「はいそうです」 
 ・あまり「他のソフトにできないこと」をやろうと思ってない 
 ・むしろ今の問題は「他のソフトにできること」が 
  ほとんどできないこと 
  ...
とりあえずおしまい 
ご清聴ありがとうございました 
1. これはいったいなんなのか 
2. Mayaka 
3. その他の部品 
4. 実例1 探すのが大変なフィルタの自作 
5. 実例2 媒介変数決定支援 
6. 実例3 アニメーション 
...
Upcoming SlideShare
Loading in …5
×

KOMADORIによる対話的画像処理

915 views

Published on

shibuya.lisp Tech Talk #8発表資料

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

KOMADORIによる対話的画像処理

  1. 1. KOMADORI による対話的画像処理 TOYOZUMI Kouichi @TOYOZUMIKouichi FILMASSEMBLER Copyright 2014 TOYOZUMI Kouichi and FILMASSEMBLER all rights reserved.
  2. 2. 今日話すこと はじめに 1. これはいったいなんなのか 2. Mayaka 3. その他の部品 4. 実例1 探すのが大変なフィルタの自作 5. 実例2 媒介変数決定支援 6. 実例3 アニメーション 7. その他諸々 実装の話はやりませんのであしからず FILMASSEMBLER 2
  3. 3. KOMADORIの概要 これはいったいなんなのか ・単純に言うと「画像処理ライブラリとちょっとしたおまけ」です  ・Common Lisp+C(IOのみ) ・目指すところは「自分用AfterEffects」  ・そもそもAfterEffects高くて買えなかった  ・GIMPで泣きながらマスク切って、   Objective-Cで目を真っ赤にして書いたプログラムで処理した   (INTERCEPTOR-preyer-のとき) ・「はたしてAfterEffectsってベストなんだろうか」  ・最大の問題はプログラマブルであるかどうか ・現状としてはGUIもなければ安定性もない  おまけに大した機能もない  ・でもまあまあ使えます FILMASSEMBLER 3
  4. 4. KOMADORIの特長(未成部分含む) これはいったいなんなのか フィルム・映像における「抽象度のスペクトル」 シーン カット コマ レイヤ 画像 画素 画素成分値(RGBA)  自在に上昇下降して操作できる ・動的プログラミング言語としての柔軟性や  軽量言語並の手軽さの中で  画像処理プログラミングができる  ・一般的に記述量が少ない  ・巨大なシステムをCLのみで書ける ・場合によってはCを凌ぐ性能が出せる ・僅かだがインタラクティブ性がある FILMASSEMBLER 4
  5. 5. 旭町から来たもうひとつの中核 Mayaka ・MayakaはKOMADORIの中心となる画像処理ライブラリ  ・Mayaka: A Yet Another Kernel from Asahi-cho   ・再帰的頭字語+Plan9: from outer space ・先々代の中核MagicNumber  ・どれだけCL処理系の最適化が実用に耐えるか検証  ・動画処理もやった  ・OpenCLでGPUも叩いた ・先代の中核BUDDY  ・SIMD関連のテストベッド ・どちらも特殊構文が多かったのでより汎用的に作り直した ・大学が開発開始直前に千住旭町に移転したのでこの名前 FILMASSEMBLER 5
  6. 6. 詳細は過去と未来のMeetUpで Mayaka ・画像を画素のリストとしてmapするmap-imageシリーズ  ・MagicNumberはmap-videoも持ってた   ・当然将来的にはMayakaにも移植予定 ・空間フィルタを実装するためのユーティリティ ・カスタマイズ可能な減色システムや輪郭追跡 ・画像処理向けの様々なマクロ ・基本型宣言でコンパイルや実行時のコード生成で最適化 ・一応SBCL、CCL、ACL、LispWorksで動作確認  ・しかし極めて不安定にコードが未だ書き換えられているので   なんの保証もしません ・実装の詳細はMeetUpの方で長々やってます  ・ここの話もっと詳しく、とかあったらどうぞ FILMASSEMBLER 6
  7. 7. 最適化ユーティリティ集 その他の部品 ・L4S  ・Common Lisp用の最適化ユーティリティ集  ・最適化用マクロや実行時コード生成で多用する部分を抽出   ・型宣言つけたりとか   ・なんか探してきたりとか  ・パッケージに対応してないという致命的な欠陥  ・多分一番メンテナンスされてる   ・一部を除いてテストらしきものが存在する  ・文書もかなりある FILMASSEMBLER 7
  8. 8. 画像IO その他の部品 ・tsugumi  ・これはCで書いてある   ・C11だったはず    ・blocksとかも使ってる   ・CLのバインディングも含んでるけど   ・cl-pngだったかな?遅かったので  ・ffmpegで動画にも対応して……る……?  ・内部表現がいろいろある   ・SIMDに対応させるためにあの手この手を使ってる  ・なんかカオスだぞい   ・昔MagicNumberでいろいろ実験してたときの名残などが    コメントアウトで残されている FILMASSEMBLER 8
  9. 9. REDPL その他の部品 FILMASSEMBLER 9
  10. 10. REDPL その他の部品 ・Read-Eval-Display-Print-Loop  ・今はMayakaの中に入ってる   ・でもあきらかにライブラリではないので追い出し+名付け予定  ・SLIMEの機能使ってる FILMASSEMBLER 10
  11. 11. インターレースの説明用画像 探すのが大変なフィルタの自作 ・インターレース収録という仕組みを  説明するための画像 ・仕組みは単純だがこんな画像を作ってくれる  フィルタは知らない 詳細はfilmassembler.com/article/buy-camera/ 本来の画像 奇数フィールドの実際の情報量偶数フィールドの実際の情報量 表示されている奇数フィールド表示されている偶数フィールド 拡大すると荒れているのがわかる FILMASSEMBLER 11
  12. 12. YUV表色系の説明用画像 探すのが大変なフィルタの自作 YUV420(4:1:1) ・YUV表色系という色の表し方を  説明するための画像 ・カメラで収録した映像をRGBに  変換せず取り出して  わかりやすく可視化 ・輝度チャネル以外が間引き YUV422 FILMASSEMBLER 12
  13. 13. 複数のフィルタを適用する際の媒介変数 媒介変数決定支援 ・複数の媒介変数を調整すると  その組み合わせの結果を  予測することが難しくなる ・順番にかけていくと  前のフィルタの影響を  操作できない ・基本記憶と経験とカン頼み FILMASSEMBLER 13
  14. 14. 全部のパターンを出力して比較 媒介変数決定支援 1.6 1.8 1.6 1.8 -0.025 -0.025 -0.05 -0.05 1.05 1.05 1.05 1.05 1.6 1.8 1.6 1.8 -0.025 -0.025 -0.05 -0.05 1.1 1.1 1.1 1.1 FILMASSEMBLER 14
  15. 15. 全部のパターンを出力して比較 媒介変数決定支援 ・やり方はいろいろあります  ・まあお好みの方法でやればよいかと ・contact-sheetという関数で画像リストから  コンタクトシートを生成できる、はず…… (defparameter *contrast-adjusted* (loop for value in '(1.05 1.1) collect (c-map-image1 *source* (typed-lambda ((component-t r g b a)) (components (+ (* (- r @/2) value) @/2) (+ (* (- g @/2) value) @/2) (+ (* (- b @/2) value) @/2) a))))) (defparameter *saturation-adjusted* (loop for image in *contrast-adjusted* append (loop for value in (mapcar (lambda (v) (* @ v)) '(-0.025 -0.05)) collect (c-map-image1 image (typed-lambda ((component-t r g b a)) (with-hsb (h s v) r g b (with-rgb (red green blue) h (+ s value) v (components red green blue a)))))))) (defparameter *gamma-adjusted* (loop for image in *saturation-adjusted* append (loop for value in '(1.6 1.8) collect (c-map-image1 image (typed-lambda ((component-t r g b a)) (components (gamma-adjust-component r value) (gamma-adjust-component g value) (gamma-adjust-component b value) a)))))) FILMASSEMBLER 15
  16. 16. 全部のパターンを出力して比較 媒介変数決定支援 (c-map-image1 *source* (typed-lambda ((component-t r g b a)) (with-hsb (h s v) r g b (with-rgb (red green blue) h (+ s s-value) v (components (+ (* (- (gamma-adjust-component red g-value) @/2) c-value) @/2) (+ (* (- (gamma-adjust-component green g-value) @/2) c-value) @/2) (+ (* (- (gamma-adjust-component blue g-value) @/2) c-value) @/2) a))))) FILMASSEMBLER 16
  17. 17. 全部のパターンを出力して比較 媒介変数決定支援 Evaluation took: 1.825 seconds of real time 1.833672 seconds of total run time (1.826062 user, 0.007610 system) 100.49% CPU 6,194,199,439 processor cycles 96 bytes consed DCI 4K(4096x2160) SIMDによる加速なし 参考までに FILMASSEMBLER 17
  18. 18. 「あのしょぼい絵でありえないよねーwww」 アニメーション ・今年のエイプリルフールにすぐバレる嘘をついた  ・事故レベルの出来 ・なぜか信じられる  ・大学同期  「キャラ設定とか早く公開してほしい」  ・後輩女子  「よくも騙してくれましたね……」  ・純粋な人たち ・でもまあ、ちょっとやってみたいのは事実  ・実写なら金のかかることでもやりやすい  ・どんなに女の子並べても誰も文句言わないぜ!!  ・こいつのサンプルに使える……! FILMASSEMBLER 18
  19. 19. 手書きアニメーションの難しいところ アニメーション ・絵が描けない  ・はっきり言ってどうしようもない   ・上手い奴は線が滑らかに引ける    ・その時点で勝負ついてる  ・filmassembler.com/article/draw-like-anime/  ・姑息な手を使ってなんとかしよう ・時間の感覚が掴めない  ・「この動きを格好良くするためには何コマいるんだろ?」  ・こっちはなんとかなりそう  ・REPL方式でとりあえず動かしてみればいいじゃん   ・Draw-Scan-Render-Loop FILMASSEMBLER 19
  20. 20. 「能書きは良いから黙って絵を描きな」 アニメーション ・絵を四枚用意 - さりげなく言ってるがこれ描くのに2日かかった ・こういうのを「原画」というそうです  ・この間に「中割」というのを入れ動きを滑らかにします  ・「中割」を入れつつきれいな線で清書して   「動画」というのができるらしいです ・はっきり言って、どういう基準で「原画」を描くのかわからん  ・コードだって原理もわからず取りあえず動かしてきたんだし   いまさら……まあいいや!! FILMASSEMBLER 20
  21. 21. 機械に頼って必要な中割の枚数を割り出す アニメーション ・まあこんな感じで!! (defun original-frame-shot (directory filenames numbers dst) (let* ((count (length numbers)) (counter 0) (src-images (loop for index from 1 to count for src-filename in filenames for number in numbers collect (cons (affine-transform-image (affine-transform-image (load-image src-filename) (rotate-affine-matrix 90.0)) (scaling-affine-matrix 0.547164434 0.547164434)) number)))) (loop for index from 0 below count for pair = (nth index src-images) for current = (car pair) for number = (cdr pair) for next = (unless (= index (1- count)) (car (nth (1+ index) src-images))) for delta = (/ 1.0 number) do (loop named loop for i from 0 below number for alpha = 0.0 then (+ alpha delta) do (print alpha) do (save-image (if (null next) current (c-map-image2 next current (typed-lambda ((component-t srcr srcg srcb srca dstr dstg dstb dsta)) (setq srca (if (>= 1.0 alpha) alpha 1.0)) (setq dsta (- 1.0 srca)) (values (+ (* srca srcr) (* dsta dstr)) (+ (* srca srcg) (* dsta dstg)) (+ (* srca srcb) (* dsta dstb)) @)))) (format nil "~adst~2,'0d.png" directory counter)) do (incf counter)))) (sb-ext:run-program "/usr/local/bin/convert" (list "-alpha" "remove" "-loop" "0" "-delay" "12.5" (format nil "~adst*.png" directory) (format nil "~a~a" directory dst)))) FILMASSEMBLER 21
  22. 22. 機械に頼って必要な中割の枚数を割り出す アニメーション ・要は各原画とその原画が完全に次の原画に入れ替わるまで  何コマ使うかを渡すと、  良い感じに合成して全コマ出力してくれるコードです ・これで気に入った動きになったら、入力に従って  中割作って動画にすれば結構簡単にアニメできんじゃね? (let1 directory "/Users/toyozumikouichi/Desktop/" (original-frame-shot directory ;; 出力ディレクトリ (loop for index from 1 to 5 collect (format nil "~aimg~3,'0d.png" directory index))               ;; 原画のパスのリスト '(8 1 1 4 4)               ;; 各原画を何コマ表示するかを示したリスト "test4.gif"               ;; 出力するアニメgifのファイル名 )) FILMASSEMBLER 22
  23. 23. KOMADORIでコマ撮り アニメーション FILMASSEMBLER 23
  24. 24. 今後の改修の最優先事項ではありません アニメーション convert -alpha remove -loop 0 -delay 12.5 ~/Desktop/dst*.png test2.gif ・今のところMayakaさんがアニメgifに対応してないので  「おねがい☆ImageMagick」で ・-delay 12.5になってるのは秒8コマだから  ・12コマとかもあるらしいし、ディズニーは24コマらしい ・さっきのコードではsb-ext:run-programで走らせてます FILMASSEMBLER 24
  25. 25. キェェェェェェアァァァァァァウゴイタァァァァァァァ!!! アニメーション FILMASSEMBLER 25
  26. 26. キェェェェェェアァァァァァァウゴイタァァァァァァァ!!! アニメーション これがいいかな→ 8 1 1 4 頷き部分は一コマでないと 速度が出ないのがわかった FILMASSEMBLER 26
  27. 27. 問題点と解決策を見つける アニメーション ・頷いた後に弾むような反動がないのですごい不自然  ・原画一枚増やそう ・頭変形してるよ!!  ・直そう FILMASSEMBLER 27
  28. 28. 問題点と解決策を見つける アニメーション ・「微妙な動き」が「気色悪い変形」に  ・髪の毛をどう動かすか考え切れてなかった ・追加した原画が時間なかったので変 ・とりあえずこんな感じで使えるのであとは反復 FILMASSEMBLER 28
  29. 29. 今回割愛した使用例など その他諸々 ・イラスト作るために使ってたりします  ・「描く」じゃなくて「作る」の時点でちょっとおかしい ・他にも簡単な画像分析系とかに使えたりします  ・簡単な捏造なら輝度可視化機能とかで見破れます ・減色機能があるので印刷物を電子ペーパ用に最適化したりできます ・Webサーバ+DBと繋いでアセットマネジメント試したりしてました FILMASSEMBLER 29
  30. 30. これ別にxxxってソフト使えばできるじゃん その他諸々 ・ほとんどにおいて「はいそうです」  ・あまり「他のソフトにできないこと」をやろうと思ってない  ・むしろ今の問題は「他のソフトにできること」が   ほとんどできないこと   ・あとテストがないのですごいバグが多い ・何がしたいのか  ・「他のソフトじゃあんまり面倒でやりたくないこと」   が簡単になる   ・「機能探すより書いた方が早いや」  ・もちろん、「他のソフトで簡単にできること」は   簡単にできるようにしたい  ・自分の自分による自分のための映像処理基盤 FILMASSEMBLER 30
  31. 31. とりあえずおしまい ご清聴ありがとうございました 1. これはいったいなんなのか 2. Mayaka 3. その他の部品 4. 実例1 探すのが大変なフィルタの自作 5. 実例2 媒介変数決定支援 6. 実例3 アニメーション 7. その他諸々 github.com/TOYOZUMIKouichi filmassembler.com FILMASSEMBLER 31

×