使用したライブラリ
【画像処理100本ノック】独自の画像入出力クラスを作る
【画像処理100本ノックに挑戦】独自の行列クラスを作る
Q.31. アフィン変換(スキュー)
(1)アフィン変換を用いて、出力(1)のようなX-sharing(dx = 30)画像を作成せよ。
(2)アフィン変換を用いて、出力2のようなY-sharing(dy = 30)画像を作成せよ。
(3)アフィン変換を用いて、出力3のような幾何変換した(dx = 30, dy = 30)画像を作成せよ。
(x,y) \to (ay+x,y)
のような感じに変換すればよいことがわかります。
int main()
{
PPM ppm("imori.pnm");
int width = ppm.Get_width();
int height = ppm.Get_height();
double a = 30./(double)height;
Matrix A(2, 2);
A.set({
1, a,
0, 1
});
Matrix B(2, 2);
B.set({
1, 0,
a, 1
});
Matrix C(2, 2);
C.set({
1, a,
a, 1
});
int Width = width+30;
int Height = height+30;
PPM ppm2(Width, Height);
for(int j=0; j<height; j++)
for (int i = 0; i < width; i++)
{
Matrix X(2);
X.set({
(double)i,
(double)j
});
Matrix X2 = C * X;
int i2 = X2(0, 0);
int j2 = X2(1, 0);
if (0 <= i2 && i2 < Width && 0 <= j2 && j2 < Height)
{
ppm2(i2, j2, 'r') = ppm(i, j, 'r');
ppm2(i2, j2, 'g') = ppm(i, j, 'g');
ppm2(i2, j2, 'b') = ppm(i, j, 'b');
}
}
ppm2.Flush("out.ppm");
return 0;
}