---
title: ImageMagick内部入門第十六回、Distortion-1
tags:  #imagemagick  
author: [よや](https://convert.docswell.com/user/yoya)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/PJRW5YG479.jpg?width=480
description: ImageMagick の -distort オプションの解説
published: April 12, 24
canonical: https://convert.docswell.com/s/yoya/ZM1E26-imagemagick-16
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/PJRW5YG479.jpg)

ImageMagick 内部入門
第十六回 (Distortion〜空間歪曲#1)
SRT 〜 Perspective
2024/4/12(金) “よや” &lt;yoya@awm.jp&gt;


# Page. 2

![Page Image](https://bcdn.docswell.com/page/PEXPKGXZ7X.jpg)

内部入門シリーズ(1/2)
•
•
•
•
•
•
•
•
•
•
•
•
(第一回) 全体構成
(第二回) データ構造 〜 ImageList, ImageInfo
(第三回) Magick API 〜 MagickWand / MagickCore
(第四回) 画像形式処理 〜 Coders と Delegate
(第五回) メタデータ 〜 XMP, Profile
(第六回) システム設定 〜 policy.xml 等
(第七回) 減色
〜 ColorCube
(第八回) ビットdepth 〜 depth 変換
(第九回) 2値化 〜 threshold
(第十回) ディザリング 〜 組織 (拡散ディザは延期)
(第十一回) ICCプロファイル 〜 RGB  CMYK 色空間
(第十二回) 色フィルタ 〜 Colorize ColorMatrix


# Page. 3

![Page Image](https://bcdn.docswell.com/page/3EKD54WVJD.jpg)

内部入門シリーズ (2/2)
•
•
•
•
(第十三回)
(第十四回)
(第十五回)
(第十六回)
色modulate 〜 modulate (変調)
WebP 画像
画像比較
〜 Compare
空間歪曲#1 〜 Distortion SRT, Affine, Perspective
今回の話
• (第十七回) 空間歪曲#2 〜 Distortion Shepards &amp;
Composite Displacement
• (第十八回) 空間歪曲#3 〜 Distortion Resize
• (第十九回) 空間歪曲#4 〜 Distortion ARC, Polar, Barrel
• (第二十回) 畳み込み
〜 Convolve
• (第N回) 各画像処理
• 畳み込み、モルフォロジー、OpenMP, distribute-pixel-cache


# Page. 4

![Page Image](https://bcdn.docswell.com/page/L73RKLWQJ5.jpg)

目次
• Distortion とは
• Distortion の -/+ オプション
• Distortion の種類
• Distortion の基礎
• SRT (ScaleRotateTranslate)
• Affine / Helmert
• Homography / Perspective / Bilinear


# Page. 5

![Page Image](https://bcdn.docswell.com/page/87DY3NKW7G.jpg)

-distort オプション
• 画像を空間的に歪ませるメソッド
-distort &lt;method&gt; &lt;arguments&gt; # bestfit:False
+distort &lt;method&gt; &lt;arguments&gt; # bestfit:True
• 分かりやすいのは Scale(拡大縮小)/Rotate(回転)/Translate(移動)
# (0,0)を原点として、1倍スケール、45度回転、(200,0)移動
% magick logo: -distort SRT 0,0,1,45,200,0 output.jpg


# Page. 6

![Page Image](https://bcdn.docswell.com/page/VJP645KXE8.jpg)

-distort/+distort オプション
• -/+distort の違い
# 画像が収まるようキャンバスを調整 (bestfit)
% magick logo: +distort SRT 200,0,1,45 output.jpg
# 元のキャンバスを維持する
% magick logo: -distort SRT 200,0,1,45 output.jpg


# Page. 7

![Page Image](https://bcdn.docswell.com/page/2EV3XPV37Q.jpg)

Distortion の種類
• magick –list distort で一覧表示。今回は SRT と Perspective
線形
% magick -list distort | column
Affine
PerspectiveProjection
DePolar
RigidAffine
BilinearForward
Barrel
AffineProjection BilinearReverse
BarrelInverse
ScaleRotateTranslate
Polynomial
Shepards
SRT
Arc
Resize
Perspective
Polar
Affine
RigidAffine
AffineProjection
ScaleRotateTranslate
SRT
Resize
射影
Perspective
PerspectiveProjection
BilinearForward
BilinearReverse
Polynomial
円環
Arc
Polar
DePolar
レンズ歪み
Barrel
BarrelInverse
任意の点
Shepards


# Page. 8

![Page Image](https://bcdn.docswell.com/page/57G3VPLYJL.jpg)

Distortion 実装コード
• https://github.com/ImageMagick/ImageMagick/blob/main/
MagickCore/distort.c


# Page. 9

![Page Image](https://bcdn.docswell.com/page/4EQ562Y6JP.jpg)

Distortion の基礎
• Forward or Direct Pixel Mapping
• src(入力画像) の座標を計算して dst(変換後)を割り出してレンダリン
グすると、dst 隙間ができる。
拡大
(ドットのイメージ)
回転


# Page. 10

![Page Image](https://bcdn.docswell.com/page/KJ494LWM71.jpg)

Distortion の基礎
• Reverse Pixel Mapping
例えば
2倍だったら ½ の計算
• Destination 側の pixel 位置から逆の計算をして src を求める
• さすれば Destination が必ず埋まる
逆回転の計算


# Page. 11

![Page Image](https://bcdn.docswell.com/page/LE1K4LYYJG.jpg)

Distortion の基礎
• Distortion は常に逆問題を突きつけられる
• 拡大 =&gt; 縮小
• 回転 =&gt; 逆回転
• 移動 =&gt; 逆移動
• 行列演算 =&gt; 逆行列
• アフィン変換
• 射影変換


# Page. 12

![Page Image](https://bcdn.docswell.com/page/GEWDXVG1J2.jpg)

Distortion SRT
• 引数1つは R(Rotate)、２つで S(Scale),R(Rotate)。原点中心
% magick logo: -distort SRT 45 output.jpg #中心を原点として、45度回転
% magick logo: -distort SRT 2,45 output.jpg #中心原点、2倍して45度回転
% magick logo: +distort SRT 2,45 output.jpg # 〃 、 + サイズ調整
+


# Page. 13

![Page Image](https://bcdn.docswell.com/page/47ZG64LXE3.jpg)

Distortion SRT (続き)
• S,R だけだと原点が中心、T を追加するのはひと手間いる
% magick logo: -distort SRT 2,45,200,0 output.jpg #中心原点、2倍、45度回転、(200,0)移動
#(2,45)原点、200倍、0度回転
# 中心(w/2,h/2)原点、2倍、45度回転、(200,0)移動
% magick logo: -distort SRT &quot;%[fx:w/2],%[fx:h/2],2,45,200,0&quot; output.jpg


# Page. 14

![Page Image](https://bcdn.docswell.com/page/YJ6Y23WP7V.jpg)

Distortion SRT
• 引数の数で以下のように解釈される (正直トリッキー)
中心を原点に
SR
X,Yを原点に
SR
1
-distort SRT &quot;
2
-distort SRT &quot;
3
-distort SRT &quot;X,Y,
R
&quot; # X,Y を原点にする
4
-distort SRT &quot;X,Y,S,
R
&quot;
5
-distort SRT &quot;X,Y,Sx,Sy,R
6
-distort SRT &quot;X,Y,S,
7
-distort SRT &quot;X,Y,Sx,Sy,R,Xt,Yt&quot;
S,
R
&quot; # R:Rotate (中心原点)
R
&quot; # S:Scale (中心原点)
&quot; # Sx,Sy: xy別Scale
R,Xt,Yt&quot; # Xt,Yt は移動


# Page. 15

![Page Image](https://bcdn.docswell.com/page/GJ5G2LMPJ4.jpg)

Distortion SRT
• 引数処理


# Page. 16

![Page Image](https://bcdn.docswell.com/page/9E2Y4L9ZER.jpg)

アフィン(Affine)変換
• 3x3 行列で SRT を表現できる
© https://en.wikipedia.org/wiki/Affine_transformation


# Page. 17

![Page Image](https://bcdn.docswell.com/page/D7YGMQ4N7M.jpg)

ヘルマート(Helmert)変換
• Sx=Sy (縦横比不変)かつ同符号
(反転なし) Shear/Skew(剪断)
不要ならヘルマート変換(相似変換)
© https://it.wikipedia.org/wiki/Trasformazione_di_Helmert


# Page. 18

![Page Image](https://bcdn.docswell.com/page/VENGWKYVJ8.jpg)

アフィン変換
• アフィン変換の行列係数を直接指定できる
• 単位行列の例
1
0
0
0 0
1 0
0 1
2
0
0
0 0
1 0
0 1
# 単位行列を指定
% magick logo: -distort AffineProjection &quot;1,0, 0,1, 0,0”output.jpg
# 横に2倍
% magick logo: +distort AffineProjection &quot; 2,0, 0,1, 0,0”output.jpg


# Page. 19

![Page Image](https://bcdn.docswell.com/page/Y79WXVPV73.jpg)

• SRT もアフィン変換で処理してる


# Page. 20

![Page Image](https://bcdn.docswell.com/page/G78N2PD4JD.jpg)

アフィン変換の限界
• 見ての通り、平行四辺形までの変換
• 台形に変換するには射影変換が必要
• Homography (射影変換)
• もしくは、
Perspective (遠近法)
© https://en.wikipedia.org/wiki/Homography
© https://zh.wikipedia.org/wiki/单应性


# Page. 21

![Page Image](https://bcdn.docswell.com/page/L7LP21MVJR.jpg)

射影変換(Homography)とは
• 方程式
• 行列表現
• x, y に応じてスケールも変化させ、透視図法を表現する
© https://speakerdeck.com/imagire/dan-wei-zheng-fang-xing-falseshe-ying-bian-huan-falsebian-huan-xi-shu


# Page. 22

![Page Image](https://bcdn.docswell.com/page/4EM48WYNJW.jpg)

Perspective
• -distort Perspective は {src, dst} x 4組の８点指定
% convert sample.jpg -distort Perspective \
&#039;173,73 0,0 457,77 640,0 420,409 640,480 129,356 0,480&#039; \
pers.jpg
0,0
173,73
640,0
457,77
420,409
640,480
129,356
0,480


# Page. 23

![Page Image](https://bcdn.docswell.com/page/PERW5Y94J9.jpg)

Perspective -verbose
• -verbose で射影変換の行列係数が出てくる
% convert sample.jpg –verbose -distort Perspective \
&#039;173,73 0,0 457,77 640,0 420,409 640,480 129,356 0,480&#039; \
pers.jpg
Perspective Projection:
-distort PerspectiveProjection \
&#039;2.96457, 0.460922, -546.517, -0.0281816,
2.00089, -141.19, 0.00065016, 0.000276416&#039;
Perspective Distort, FX Equivelent:
-fx &#039;ii=i+page.x+0.5; jj=j+page.y+0.5;
rr=-0.000220141*ii -8.74352e-05*jj + 1;
Reverse
xx=(+0.343145*ii -0.102946*jj +173)/rr;
Mapping
yy=(-0.0107009*ii +0.558456*jj +73)/rr;
rr&gt;0 ? p{xx-page.x-0.5,yy-page.y-0.5} : blue&#039; \
sample.jpg=&gt;pers.jpg JPEG 640x480 640x480+0+0 8-bit sRGB 92709B 0.190u 0:00.027


# Page. 24

![Page Image](https://bcdn.docswell.com/page/P7XPKGQZJX.jpg)

Perspective
• 座標リストに最小二乗法&amp;ガウスジョルダン消去法で係数算出


# Page. 25

![Page Image](https://bcdn.docswell.com/page/37KD549VED.jpg)

射影変換の行列係数の導出
• https://speakerdeck.com/imagire/dan-wei-zheng-fang-xingfalseshe-ying-bian-huan-falsebian-huan-xi-shu
長々とした証明


# Page. 26

![Page Image](https://bcdn.docswell.com/page/LJ3RKL9QE5.jpg)

Bilinear
• Perspective と引数は同じ
• 中心を維持する。グリッドが等間隔。(遠くが縮まない)
Original(元画像)
Perspective(透視投影)
Bilinear(双線形)


# Page. 27

![Page Image](https://bcdn.docswell.com/page/8JDY3NGWJG.jpg)

Bilinear -verbose
• -verbose で方程式が出てくる。
% % convert sample.jpg -verbose -distort Bilinear ¥
&#039;173,73 0,0 457,77 640,0 420,409 640,480 129,356 0,480&#039; ¥
𝑖 = 𝑎𝑥 + 𝑏𝑦 + 𝑐𝑥𝑦 + 𝑑
bili.jpg
𝑗 = 𝑒𝑥 + 𝑓𝑦 + 𝑔𝑥𝑦 + ℎ
BilinearForward Mapping Equations:
i = +2.275062*x +0.393838*y -0.000341*x*y -418.029409;
j = +0.042795*x +1.803775*y -0.000859*x*y -128.236482;
BilinearForward Distort, FX Equivalent:
-fx &#039;ii=i+page.x+418.529409; jj=j+page.y+128.736482;
bb=-0.000859*ii +0.000341*jj +4.086845;
Reverse
rt=bb*bb +0.001108*(0.042795*ii-2.275062*jj);
Mapping
yy=( -bb + sqrt(rt) ) / -0.000554;
( だいぶ複雑)
xx=(ii -0.393838*yy)/(2.275062 -0.000341*yy);
(rt &lt; 0 ) ? red : p{xx-page.x-0.5,yy-page.y-0.5}&#039;
sample.jpg=&gt;bili.jpg JPEG 640x480 640x480+0+0 8-bit sRGB 91258B 0.070u 0:00.024


# Page. 28

![Page Image](https://bcdn.docswell.com/page/VEP6453X78.jpg)

Bilinear
• Perspective と同様に行列を解くが、逆変換の式が複雑。


# Page. 29

![Page Image](https://bcdn.docswell.com/page/27V3XP43JQ.jpg)

参考
• https://www.imagemagick.org/Usage/distorts/
• https://en.wikipedia.org/wiki/Homography
• https://speakerdeck.com/imagire/dan-wei-zheng-fang-xingfalseshe-ying-bian-huan-falsebian-huan-xi-shu
• https://qiita.com/yoya/items/c54f3e2a77eef5468b1f
• https://yoya.github.io/image.js/homography.html


# Page. 30

![Page Image](https://bcdn.docswell.com/page/5JG3VP1YEL.jpg)

次回(以降)予告
• Displacement (ルックアップテーブルによる任意の変換)
• Resize (実は –resize より高品質な –distort Resize)
• ARC(円弧), Polar(極座標)


