HTML5 Canvas で学ぶアフィン変換

HTML5 Canvas で学ぶ
   アフィン変換
       2012/09/25 SWF 研究会#2
                    @a_bicky
自己紹介
•   Takeshi Arabiki
     ‣   社会人2年目の底辺 Web エンジニア

     ‣   Twitter & はてな: @a_bicky & id:a_bicky

•   お仕事
    JSX や JavaScript でコードを書いたり

•   興味など
    機械学習、自然言語処理、R

•   ブログ
    あらびき日記 http://d.hatena.ne.jp/a_bicky/
アフィン変換とは?
こういう変換とか




      ※アニメーションです
こういう変換とか




      ※アニメーションです
アフィン変換
ざっくりした意味
 平行移動を伴う線形変換
   ✓    0
            ◆       ✓           ◆✓       ◆       ✓        ◆
       x                a   c        x               tx
                =                            +
       y0               b   d        y               ty
                    線形変換                     平行移動


   0        1       0                10          1
     x0       a             c   tx     x
   @ y0 A = @ b             d   ty A @ y A
     1        0             0    1     1
同次座標系
 1つの行列で線形変換と平行移動を表すために次元を1つ増やす
Canvas によるアフィン変換
      0    0
               1   0           10      1
        x        a       c   tx     x
      @ y0 A = @ b       d   ty A @ y A
        1        0       0    1     1

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.transform(a, b, c, d, tx, ty);
ctx.drawImage(img, 0, 0);
拡大・縮小
                          0      1     0                10       1
                             x0        sx 0 0     x
                         0
                 sx = w /w @ y 0 A = @ 0 sy 0 A @ y A
  元の画像                  0    1          0 0 1     1
                      w              0      1
                    w                  sx x
                           x       = @ sy y A
                                         1
         0   h
     h
                           var canvas = document.getElementById("canvas");
      0                    var ctx = canvas.getContext("2d");
sy = h /h                  ctx.scale(sx, sy);
                 y         ctx.drawImage(img, 0, 0);
回転
               0   0
                       1   0                        10       1
                 x         cos     sin   0    x
               @ y 0 A = @ sin    cos    0 A@ y A
元の画像
                 1           0      0    1    1
                         0               1
                           x cos   y sin
           ✓   x       = @ x sin + y cos A
                                 1


               var canvas = document.getElementById("canvas");
               var ctx = canvas.getContext("2d");
               ctx.rotate(theta);
       y       ctx.drawImage(img, 0, 0);
平行移動
                 0    0
                          1   0               10       1
                   x        1 0           tx     x
                 @ y0 A = @ 0 1           ty A @ y A
元の画像
                   1        0 0            1     1
                          0               1
            tx              x + tx
       ty        x      = @ y + ty        A
                              1


                  var canvas = document.getElementById("canvas");
                  var ctx = canvas.getContext("2d");
                  ctx.translate(tx, ty);
            y     ctx.drawImage(img, 0, 0);
剪断
               0   0
                       1   0                      10        1
                 x           1     tan ⇥ 0     x
               @ y 0 A = @ tan       1    0 A@ y A
元の画像
                 1           0       0    1    1
                         0              1
                           x + y tan ⇥
           ↵   x       = @ x tan + y A
                                1

               var canvas = document.getElementById("canvas");
               var ctx = canvas.getContext("2d");
               ctx.transform(1, Math.tan(alpha),
                             Math.tan(beta), 1
       y                     0, 0);
               ctx.drawImage(img, 0, 0);
デモ
                      アフィン変換 デモ
時間がないのでやりません!
                  http://abicky.net/swf_study/2/


インタラクティブに変換して
みたい人は是非お試しください!
自作 Flash Player
   あるある
特定のシェイプが
表示されない><
い ?
                      て な
                 でき
              ース
           く パ
     正 し
 像 を
画
       変換行列がおかしい?
透過                         い ?
    度の                  か し
       問題?             お
                 序   が
              画順
            描
い ?
                      て な
                 でき
              ース
           く パ
     正 し
 像 を
画
       変換行列がおかしい?
透過                         い ?
    度の                  か し
       問題?             お
                 序   が
              画順
            描
Canvas では現在の変換行列を
  取得できない... orz
作った!
HTML5 の Canvas で getTransform が使えるようにしてみた - あらびき日記
          http://d.hatena.ne.jp/a_bicky/20120724/1343084686




                             ← ロードすると getTransform が使える
ここで問題
Canvas で
x, y 軸方向に2倍する
変換行列を適用してから
x, y 軸方向に1移動する
変換行列を適用すると
  どうなるか?
正しいのはどっち?
            1

        1




    1               1   2


1               1

                2
正しいのはどっち?
            1

        1




                    ○
    1               1   2


1               1

                2
正しいのはどっち?
正しいのはどっち?


   ○
最初 getTransform は
  逆になってた
      ><
簡単な解説
        元の座標系での値 スケール2倍の座標系での値
                                          2
    1           1   1                 1   1

1           1                   1
            1                 2 1




                         スケールを2倍した座標系で1移動する
           スケールを2倍する
                        (元の座標系では2移動することになる)


                                    スケールを2倍する
                              (移動した上での2倍なので
                               移動量も2倍になる)
                    まず1移動する
まとめ
まとめ
•   アフィン変換は平行移動伴う線形変換

•   Canvas で変換行列の状態を取得する getTransform を作った

•   複数の変換行列を適用する場合は最初に適用するものが
    最左にくる
参考
•   アフィン変換とは - 大人になってからの再学習

•   にゃあプロジェクト - ウェブログ - Matrixって何だお? (1)

•   アフィン変換 画像処理ソリューション

•   無職のプログラミング  [HTML5 Canvas]変形メソッド
    scale(),rotate(),translate() の実行順序
1 of 29

Recommended

ソフトウェア設計における 意思決定とそのレビューの秘訣 by
ソフトウェア設計における 意思決定とそのレビューの秘訣ソフトウェア設計における 意思決定とそのレビューの秘訣
ソフトウェア設計における 意思決定とそのレビューの秘訣Yoshitaka Kawashima
4.7K views39 slides
WebSocketのキホン by
WebSocketのキホンWebSocketのキホン
WebSocketのキホンYou_Kinjoh
24.1K views63 slides
TVM の紹介 by
TVM の紹介TVM の紹介
TVM の紹介Masahiro Masuda
5.5K views68 slides
リクルート式 自然言語処理技術の適応事例紹介 by
リクルート式 自然言語処理技術の適応事例紹介リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介Recruit Technologies
39.2K views69 slides
モデルベース要件定義 at BPStudy by
モデルベース要件定義 at BPStudyモデルベース要件定義 at BPStudy
モデルベース要件定義 at BPStudyZenji Kanzaki
7.6K views38 slides
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 by
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 Ken'ichi Matsui
96K views96 slides

More Related Content

What's hot

「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京 by
「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京
「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京Koichi Hamada
289K views85 slides
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料 by
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料Yusuke Uchida
16K views38 slides
マイクロサービスにおける 非同期アーキテクチャ by
マイクロサービスにおける非同期アーキテクチャマイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける 非同期アーキテクチャota42y
49K views105 slides
DLLab 異常検知ナイト 資料 20180214 by
DLLab 異常検知ナイト 資料 20180214DLLab 異常検知ナイト 資料 20180214
DLLab 異常検知ナイト 資料 20180214Kosuke Nakago
13.6K views59 slides
[Dl輪読会]introduction of reinforcement learning by
[Dl輪読会]introduction of reinforcement learning[Dl輪読会]introduction of reinforcement learning
[Dl輪読会]introduction of reinforcement learningDeep Learning JP
6K views46 slides
Tensorflow Liteの量子化アーキテクチャ by
Tensorflow Liteの量子化アーキテクチャTensorflow Liteの量子化アーキテクチャ
Tensorflow Liteの量子化アーキテクチャHitoshiSHINABE1
4.2K views25 slides

What's hot(20)

「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京 by Koichi Hamada
「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京
「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京
Koichi Hamada289K views
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料 by Yusuke Uchida
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Yusuke Uchida16K views
マイクロサービスにおける 非同期アーキテクチャ by ota42y
マイクロサービスにおける非同期アーキテクチャマイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける 非同期アーキテクチャ
ota42y49K views
DLLab 異常検知ナイト 資料 20180214 by Kosuke Nakago
DLLab 異常検知ナイト 資料 20180214DLLab 異常検知ナイト 資料 20180214
DLLab 異常検知ナイト 資料 20180214
Kosuke Nakago13.6K views
[Dl輪読会]introduction of reinforcement learning by Deep Learning JP
[Dl輪読会]introduction of reinforcement learning[Dl輪読会]introduction of reinforcement learning
[Dl輪読会]introduction of reinforcement learning
Deep Learning JP6K views
Tensorflow Liteの量子化アーキテクチャ by HitoshiSHINABE1
Tensorflow Liteの量子化アーキテクチャTensorflow Liteの量子化アーキテクチャ
Tensorflow Liteの量子化アーキテクチャ
HitoshiSHINABE14.2K views
SIMDで整数除算 by shobomaru
SIMDで整数除算SIMDで整数除算
SIMDで整数除算
shobomaru7.8K views
【CVPR 2020 メタサーベイ】Neural Generative Models by cvpaper. challenge
【CVPR 2020 メタサーベイ】Neural Generative Models【CVPR 2020 メタサーベイ】Neural Generative Models
【CVPR 2020 メタサーベイ】Neural Generative Models
cvpaper. challenge888 views
さるでも分かりたい9dofで作るクォータニオン姿勢 by ytanno
さるでも分かりたい9dofで作るクォータニオン姿勢さるでも分かりたい9dofで作るクォータニオン姿勢
さるでも分かりたい9dofで作るクォータニオン姿勢
ytanno8K views
心理的安全性の構造 デブサミ2019夏 structure of psychological safety by Tokoroten Nakayama
心理的安全性の構造 デブサミ2019夏 structure of psychological safety心理的安全性の構造 デブサミ2019夏 structure of psychological safety
心理的安全性の構造 デブサミ2019夏 structure of psychological safety
Tokoroten Nakayama188.9K views
OpenAI FineTuning を試してみる by iPride Co., Ltd.
OpenAI FineTuning を試してみるOpenAI FineTuning を試してみる
OpenAI FineTuning を試してみる
iPride Co., Ltd.1.4K views
【DL輪読会】A Path Towards Autonomous Machine Intelligence by Deep Learning JP
【DL輪読会】A Path Towards Autonomous Machine Intelligence【DL輪読会】A Path Towards Autonomous Machine Intelligence
【DL輪読会】A Path Towards Autonomous Machine Intelligence
Deep Learning JP14.8K views
画像処理ライブラリ OpenCV で 出来ること・出来ないこと by Norishige Fukushima
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
Norishige Fukushima221.6K views
強化学習と逆強化学習を組み合わせた模倣学習 by Eiji Uchibe
強化学習と逆強化学習を組み合わせた模倣学習強化学習と逆強化学習を組み合わせた模倣学習
強化学習と逆強化学習を組み合わせた模倣学習
Eiji Uchibe25.3K views
自動微分変分ベイズ法の紹介 by Taku Yoshioka
自動微分変分ベイズ法の紹介自動微分変分ベイズ法の紹介
自動微分変分ベイズ法の紹介
Taku Yoshioka5.7K views
Rustに触れて私のPythonはどう変わったか by ShunsukeNakamura17
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
CVPR2016 reading - 特徴量学習とクロスモーダル転移について by Akisato Kimura
CVPR2016 reading - 特徴量学習とクロスモーダル転移についてCVPR2016 reading - 特徴量学習とクロスモーダル転移について
CVPR2016 reading - 特徴量学習とクロスモーダル転移について
Akisato Kimura3.8K views
「世界モデル」と関連研究について by Masahiro Suzuki
「世界モデル」と関連研究について「世界モデル」と関連研究について
「世界モデル」と関連研究について
Masahiro Suzuki13.1K views

More from Takeshi Arabiki

開発の心得 by
開発の心得開発の心得
開発の心得Takeshi Arabiki
5K views18 slides
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜 by
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜Takeshi Arabiki
10.9K views31 slides
Introduction to Japanese Morphological Analysis by
Introduction to Japanese Morphological AnalysisIntroduction to Japanese Morphological Analysis
Introduction to Japanese Morphological AnalysisTakeshi Arabiki
16.8K views25 slides
R による文書分類入門 by
R による文書分類入門R による文書分類入門
R による文書分類入門Takeshi Arabiki
30.7K views59 slides
Rのデータ構造とメモリ管理 by
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
15.2K views22 slides
Introduction to Favmemo for Immature Engineers by
Introduction to Favmemo for Immature EngineersIntroduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature EngineersTakeshi Arabiki
2.9K views21 slides

More from Takeshi Arabiki(17)

クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜 by Takeshi Arabiki
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜
Takeshi Arabiki10.9K views
Introduction to Japanese Morphological Analysis by Takeshi Arabiki
Introduction to Japanese Morphological AnalysisIntroduction to Japanese Morphological Analysis
Introduction to Japanese Morphological Analysis
Takeshi Arabiki16.8K views
R による文書分類入門 by Takeshi Arabiki
R による文書分類入門R による文書分類入門
R による文書分類入門
Takeshi Arabiki30.7K views
Rのデータ構造とメモリ管理 by Takeshi Arabiki
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
Takeshi Arabiki15.2K views
Introduction to Favmemo for Immature Engineers by Takeshi Arabiki
Introduction to Favmemo for Immature EngineersIntroduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature Engineers
Takeshi Arabiki2.9K views
Rのスコープとフレームと環境と by Takeshi Arabiki
Rのスコープとフレームと環境とRのスコープとフレームと環境と
Rのスコープとフレームと環境と
Takeshi Arabiki3.2K views
twitteRで快適Rライフ! by Takeshi Arabiki
twitteRで快適Rライフ!twitteRで快適Rライフ!
twitteRで快適Rライフ!
Takeshi Arabiki8.4K views
RではじめるTwitter解析 by Takeshi Arabiki
RではじめるTwitter解析RではじめるTwitter解析
RではじめるTwitter解析
Takeshi Arabiki23.6K views
Rデータフレーム自由自在 by Takeshi Arabiki
Rデータフレーム自由自在Rデータフレーム自由自在
Rデータフレーム自由自在
Takeshi Arabiki24.3K views
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜 by Takeshi Arabiki
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
Takeshi Arabiki9.5K views
はじめてのまっぷりでゅ〜す by Takeshi Arabiki
はじめてのまっぷりでゅ〜すはじめてのまっぷりでゅ〜す
はじめてのまっぷりでゅ〜す
Takeshi Arabiki2.3K views
TwitterのデータをRであれこれ by Takeshi Arabiki
TwitterのデータをRであれこれTwitterのデータをRであれこれ
TwitterのデータをRであれこれ
Takeshi Arabiki13.5K views
Twitterのデータを取得する準備 by Takeshi Arabiki
Twitterのデータを取得する準備Twitterのデータを取得する準備
Twitterのデータを取得する準備
Takeshi Arabiki2.8K views

HTML5 Canvas で学ぶアフィン変換

  • 1. HTML5 Canvas で学ぶ アフィン変換 2012/09/25 SWF 研究会#2 @a_bicky
  • 2. 自己紹介 • Takeshi Arabiki ‣ 社会人2年目の底辺 Web エンジニア ‣ Twitter & はてな: @a_bicky & id:a_bicky • お仕事 JSX や JavaScript でコードを書いたり • 興味など 機械学習、自然言語処理、R • ブログ あらびき日記 http://d.hatena.ne.jp/a_bicky/
  • 4. こういう変換とか ※アニメーションです
  • 5. こういう変換とか ※アニメーションです
  • 6. アフィン変換 ざっくりした意味  平行移動を伴う線形変換 ✓ 0 ◆ ✓ ◆✓ ◆ ✓ ◆ x a c x tx = + y0 b d y ty 線形変換 平行移動 0 1 0 10 1 x0 a c tx x @ y0 A = @ b d ty A @ y A 1 0 0 1 1 同次座標系  1つの行列で線形変換と平行移動を表すために次元を1つ増やす
  • 7. Canvas によるアフィン変換 0 0 1 0 10 1 x a c tx x @ y0 A = @ b d ty A @ y A 1 0 0 1 1 var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); ctx.transform(a, b, c, d, tx, ty); ctx.drawImage(img, 0, 0);
  • 8. 拡大・縮小 0 1 0 10 1 x0 sx 0 0 x 0 sx = w /w @ y 0 A = @ 0 sy 0 A @ y A 元の画像 0 1 0 0 1 1 w 0 1 w sx x x = @ sy y A 1 0 h h var canvas = document.getElementById("canvas"); 0 var ctx = canvas.getContext("2d"); sy = h /h ctx.scale(sx, sy); y ctx.drawImage(img, 0, 0);
  • 9. 回転 0 0 1 0 10 1 x cos sin 0 x @ y 0 A = @ sin cos 0 A@ y A 元の画像 1 0 0 1 1 0 1 x cos y sin ✓ x = @ x sin + y cos A 1 var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); ctx.rotate(theta); y ctx.drawImage(img, 0, 0);
  • 10. 平行移動 0 0 1 0 10 1 x 1 0 tx x @ y0 A = @ 0 1 ty A @ y A 元の画像 1 0 0 1 1 0 1 tx x + tx ty x = @ y + ty A 1 var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); ctx.translate(tx, ty); y ctx.drawImage(img, 0, 0);
  • 11. 剪断 0 0 1 0 10 1 x 1 tan ⇥ 0 x @ y 0 A = @ tan 1 0 A@ y A 元の画像 1 0 0 1 1 0 1 x + y tan ⇥ ↵ x = @ x tan + y A 1 var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); ctx.transform(1, Math.tan(alpha), Math.tan(beta), 1 y 0, 0); ctx.drawImage(img, 0, 0);
  • 12. デモ アフィン変換 デモ 時間がないのでやりません! http://abicky.net/swf_study/2/ インタラクティブに変換して みたい人は是非お試しください!
  • 13. 自作 Flash Player あるある
  • 15. い ? て な でき ース く パ 正 し 像 を 画 変換行列がおかしい? 透過 い ? 度の か し 問題? お 序 が 画順 描
  • 16. い ? て な でき ース く パ 正 し 像 を 画 変換行列がおかしい? 透過 い ? 度の か し 問題? お 序 が 画順 描
  • 17. Canvas では現在の変換行列を 取得できない... orz
  • 18. 作った! HTML5 の Canvas で getTransform が使えるようにしてみた - あらびき日記 http://d.hatena.ne.jp/a_bicky/20120724/1343084686 ← ロードすると getTransform が使える
  • 20. Canvas で x, y 軸方向に2倍する 変換行列を適用してから x, y 軸方向に1移動する 変換行列を適用すると どうなるか?
  • 21. 正しいのはどっち? 1 1 1 1 2 1 1 2
  • 22. 正しいのはどっち? 1 1 ○ 1 1 2 1 1 2
  • 25. 最初 getTransform は 逆になってた ><
  • 26. 簡単な解説 元の座標系での値 スケール2倍の座標系での値 2 1 1 1 1 1 1 1 1 1 2 1 スケールを2倍した座標系で1移動する スケールを2倍する (元の座標系では2移動することになる) スケールを2倍する (移動した上での2倍なので 移動量も2倍になる) まず1移動する
  • 28. まとめ • アフィン変換は平行移動伴う線形変換 • Canvas で変換行列の状態を取得する getTransform を作った • 複数の変換行列を適用する場合は最初に適用するものが 最左にくる
  • 29. 参考 • アフィン変換とは - 大人になってからの再学習 • にゃあプロジェクト - ウェブログ - Matrixって何だお? (1) • アフィン変換 画像処理ソリューション • 無職のプログラミング  [HTML5 Canvas]変形メソッド scale(),rotate(),translate() の実行順序