Saya sedang mengerjakan masalah yang saya miliki dengan menganalisis gambar dalam PDF. Terkadang gambar diubah ukurannya, diputar, dicerminkan, dll. Saya memiliki akses ke matriks konteks PDF sebagai AffineTransform:

Contohnya:

gambar yang diubah ukurannya:

AffineTransform[[432.2279052734375, 0.0, 90.0], [0.0, 150.67495727539062, 555.257080078125]]

gambar yang diputar/dicerminkan:

AffineTransform[[593.25, 0.0, 0.0], [0.0, -768.0, 768.1500244140625]]

Diberikan contoh AffineTransform, saya berasumsi mungkin untuk menentukan:

  • skalaX
  • skalaY
  • rotasi
  • mencukur

Sayangnya, keterampilan geometri saya kurang (untuk sedikitnya). Adakah yang bisa mengarahkan saya ke arah yang benar untuk melakukan perhitungan ini?

0
Mike Cantrell 19 Maret 2020, 19:52

1 menjawab

Jawaban Terbaik

Transformasi affine dapat direpresentasikan sebagai urutan translasi, rotasi, refleksi, skala, dan geser. Cara menghitungnya disebut dekomposisi matriks.

Ada banyak opsi paket perangkat lunak untuk melakukannya, misalnya paket JAMA atau < a href="https://commons.apache.org/proper/commons-math/userguide/linear.html" rel="nofollow noreferrer">Apache Commons Math.

Dekomposisi nilai tunggal (SVD) memberi Anda dekomposisi menjadi rotasi, diikuti dengan penskalaan, diikuti oleh rotasi lain.

Berikut adalah contoh yang menggunakan JAMA untuk menghitung SVD geser, dan mengekstrak sudut rotasi dan faktor skala darinya:

import Jama.*;

public class Demo {
    public static void main(String[] args) {
        double[][] vals = {{1, 1}, {0, 2}};
        Matrix a = new Matrix(vals);
        SingularValueDecomposition svd = a.svd();
        Matrix u = svd.getU();
        Matrix v = svd.getV();
        double[] s = svd.getSingularValues();
        System.out.printf("rotate=%f scaleX=%f scaleY=%f rotate=%f\n",
                Math.toDegrees(Math.atan2(u.get(0, 1), u.get(0, 0))),
                s[0], s[1],
                Math.toDegrees(Math.atan2(v.get(0, 1), v.get(0, 0))));
    }
}

Outputnya memberi tahu Anda bahwa itu adalah rotasi 76 derajat, diikuti oleh skala X dan skala Y, diikuti oleh rotasi 58 derajat:

rotate=-58.282526 scaleX=2.288246 scaleY=0.874032 rotate=-76.717474

Hati-hati: jika transformasi Anda melibatkan membalik gambar, kode ini tidak akan berfungsi. Rutinitas SVD di JAMA akan menyatukan mirroring dengan salah satu rotasi. Karena Anda hanya memiliki matriks 2x2, Anda mungkin ingin mempertimbangkan untuk menulis implementasi SVD khusus Anda sendiri.

Dengan dekomposisi matriks lain, Anda bisa mendapatkan representasi lain, misalnya geser-skala-geser (LU dekomposisi), atau geser-skala-rotasi (penguraian QR)

2
Joni 20 Maret 2020, 16:51