5.20. Regresi dan Kesamaan¶
Dua pengukuran lagi pada kelas Image merangkum citra sebagai sesuatu selain distribusi nilai piksel. Regresi linear dari piksel yang telah di-threshold memberikan aplikasi sebuah garis yang dapat ditindaklanjuti -- masukan klasik untuk robot pengikut garis. Pengukuran kesamaan memberikan aplikasi sebuah angka tunggal yang menggambarkan seberapa mirip dua citra -- masukan alami untuk pengujian regresi golden-image atau detektor perubahan besar.
5.20.1. Regresi linear¶
Ketika piksel latar depan suatu citra kebetulan membentuk sebuah garis melintasi bingkai -- pita pada lintasan yang diikuti robot, garis cakrawala, tepi jalan atau koridor -- aplikasi biasanya tidak menginginkan setiap piksel latar depan secara individual. Ia menginginkan garis terbaik melalui semuanya, diparameterisasi sehingga dapat memutuskan bagaimana garis tersebut berorientasi dan di mana garis tersebut melintasi bingkai.
get_regression() melakukan fitting tersebut. Ia mengambil bentuk tuple ambang batas yang sama yang digunakan binary() dan find_blobs(), mengidentifikasi setiap piksel yang cocok dengan ambang batas, dan mengembalikan hasil line tunggal yang mendeskripsikan garis terbaik melalui piksel-piksel tersebut:
line = img.get_regression([(0, 60)])
if line:
img.draw_line((line.x1(), line.y1(),
line.x2(), line.y2()),
color=(255, 0, 0))
Fitting-nya adalah regresi linear Theil-Sen -- metode yang kuat yang lebih toleran terhadap outlier dibandingkan fitting least-squares yang lebih umum dikenal. Segelintir kecil piksel yang jauh dari garis sebenarnya tidak memiringkan hasil seperti yang terjadi dengan least squares, yang sesuai dengan realita output ambang batas yang berisik.
Hasil line membawa titik ujung yang dipotong ke persegi panjang citra (x1, y1, x2, y2), panjang dan magnitudo garis (length, magnitude), serta deskripsi geometri garis dalam bentuk polar (theta, rho) -- sudut garis dari horizontal dan jarak tegak lurusnya dari origin. Bentuk polar adalah yang biasanya diinginkan oleh control loop: theta memberi tahu robot ke mana garis miring, rho memberi tahu di mana garis melintasi citra, dan feedback loop pada keduanya menjaga robot tetap di tengah garis.
Beberapa argumen kata kunci menyetel ketangguhan dan biaya komputasi. x_stride dan y_stride melewati piksel selama fitting -- stride yang lebih besar membuat regresi lebih murah dengan biaya fitting piksel yang lebih sedikit. area_threshold dan pixels_threshold menolak garis yang tidak memiliki cukup piksel yang cocok di belakangnya. target_size menskalakan ulang masukan ke ukuran yang lebih kecil sebelum fitting -- regresi berjalan lebih cepat pada surrogate 80-kali-60 dari citra tanpa banyak kehilangan akurasi arah garis.
Jika tidak ada garis yang dapat di-fit dengan memadai -- jika ambang batas tidak cocok dengan piksel mana pun, atau cocok dengan pola yang tidak terlihat seperti garis -- metode mengembalikan None. Kode pengikut garis nyata melindungi setiap panggilan get_regression() dengan pemeriksaan None sebelum mengakses atribut garis.
5.20.2. Kesamaan citra¶
Jenis pengukuran yang berbeda: alih-alih bertanya "apa yang ada di dalam citra?", bertanya "seberapa mirip dua citra ini?". Operasi yang digunakan adalah get_similarity(), yang menghitung Structural Similarity Index (SSIM) antara citra sumber dan citra referensi.
s = img.get_similarity(reference)
print(s.mean, s.stdev)
SSIM adalah metrik kesamaan citra standar yang digunakan dalam pemrosesan citra karena berperilaku sesuai dengan intuisi manusia tentang kesamaan -- pergeseran kecil atau perubahan kecerahan kecil sedikit mengurangi skor, sementara perubahan struktural besar (objek yang hilang, scene yang berbeda) menguranginya secara dramatis. Skor berkisar dari -1 hingga +1: +1 berarti dua citra identik, 0 berarti tidak terkait, dan -1 berarti secara struktural berlawanan. Objek similarity yang dikembalikan mengekspos rata-rata SSIM di seluruh citra, ditambah standar deviasi, min, dan maks dari skor per-ubin.
Untuk jenis perbandingan di mana angka kecil lebih baik daripada yang besar -- pengujian regresi yang seharusnya melaporkan nol pada "tidak ada yang berubah" dan meningkat seiring akumulasi perubahan -- flag dssim=True mengembalikan structural dissimilarity: rata-rata SSIM dikurangi dari 1, sehingga nilai kembalian adalah 0.0 untuk citra yang identik dan meningkat seiring perbedaannya.
5.20.3. Kasus penggunaan SSIM¶
Dua aplikasi umum:
Pengujian regresi golden-image. Framework pengujian menangkap bingkai referensi dalam kondisi yang diketahui baik dan menyimpannya sebagai golden image. Pengujian berikutnya menangkap dalam kondisi yang sama dan membandingkan dengan golden image menggunakan SSIM. Skor di atas ambang batas tertentu (0.95 atau 0.98 tergantung toleransi) adalah lulus; di bawahnya adalah gagal. Framework pengujian tidak perlu mengetahui apa yang berubah -- skor SSIM adalah sinyalnya.
Deteksi perubahan besar. Aplikasi yang menginginkan versi lebih kasar dari frame differencing -- yang mengabaikan perubahan kecerahan kecil tetapi bereaksi terhadap perubahan struktural besar -- dapat menggunakan SSIM terhadap bingkai referensi alih-alih difference() per piksel diikuti oleh ambang batas. SSIM kurang sensitif terhadap pergeseran pencahayaan dibandingkan differencing per piksel, yang membuatnya menjadi pilihan lebih baik ketika tujuannya adalah mendeteksi "scene terlihat secara material berbeda" daripada "piksel mana pun berubah."
Kedua aplikasi menggunakan panggilan yang sama -- img.get_similarity(reference) -- dan dipicu oleh ambang batas skor yang dikembalikan. Perbedaannya hanyalah apakah ambang batas tinggi (pengujian regresi, mencari kecocokan yang hampir identik) atau rendah (deteksi perubahan, mencari perubahan struktural besar apa pun).
5.20.4. Bentuk transform-and-compare¶
Kehalusan yang berguna: get_similarity() menerima parameter x, y, x_scale, y_scale, roi, rgb_channel, alpha, color_palette, alpha_palette, hint, dan transform yang sama seperti draw_image(). Citra referensi diposisikan, diskalakan, dan ditransformasi oleh parameter tersebut sebelum perbandingan SSIM dijalankan.
Itu berarti aplikasi dapat bertanya "seberapa mirip scene ini dengan bingkai referensi setelah pergeseran / rotasi / skala yang diketahui" tanpa menyiapkan citra referensi yang telah ditransformasi sebelumnya. Ini adalah cara murah untuk membangun tracker yang mencari ruang parameter dan melaporkan transformasi mana dari referensi yang paling cocok dengan bingkai saat ini.