VISI KOMPUTER
Oleh :
Dosen Pengampu :
FAKULTAS TEKNIK
UNIVERSITAS BENGKULU
2023
1. Simple rendering (30 points)
Obtain the file bunny.npy from the data folder of this assignment and load it into Python. There
is a single variable in this file; the variable N is an h × w × 3 array of surface normals. N(i,j,1),
N(i,j,2), and N(i,j,3) are the x, y, and z components of the surface normal at the ijth surface point,
as observed by an orthographic camera with view direction (0, 0, 1).
1. Compute and display the radiance emitted from each point assuming Lambertian re-
flectance and constant albedo (equal to one), with a distant point light source in direction l
= (0, 0, 1). How is the final image related to the surface normals?
2. Compute and display the emitted radiance for three different light source directions which
are rotated i) 45◦ up, ii) 45◦ right, and iii) 75◦ right from the frontal direction l = (0, 0, 1).
Assume uniform unit albedo once again, for all cases.Can you spot errors in the field of
surface normals? What are the illumination effects being ignored in this calculation of
scene radiance?
Jawab :
Langkah pertama adalah mengimport library yang dibutuhkan. Terdapat beberapa library
yang digunakan, diantaranya adalah 'os' yang berfungsi untuk berinteraksi dengan sistem operasi,
memungkinkan pengelolaan jalur file dan direktori. 'zipfile' digunakan untuk menangani file ZIP,
termasuk dalam konteks mengekstrak isi dari file tersebut. Meskipun tidak digunakan secara
eksplisit dalam bagian kode yang ditampilkan, 'matplotlib.pyplot as plt' umumnya digunakan
untuk membuat plot atau visualisasi data. Terakhir, 'numpy as np' digunakan untuk operasi
numerik, memproses data gambar, dan menyediakan array serta fungsi matematika efisien untuk
manipulasi dan analisis data numerik
Kemudian, mendefinisikan Path Directory yaitu enentukan jalur ke file ZIP yang akan
diekstrak dan direktori tempat isi file ZIP akan diekstrak.
Lalu, mengekstrak konten dari file ZIP ke dalam direktori yang telah ditetapkan. Proses
ini melibatkan penggunaan fungsi ZipFile untuk membuka file ZIP, diikuti dengan penggunaan
extractall untuk mengekstrak semua file yang terdapat dalam arsip tersebut ke direktori yang
telah ditentukan sebelumnya.
Selanjutnya, memuat gambar dari file TIF di dalam subdirektori dan menyimpannya
dalam bentuk daftar. Juga memuat file numpy (.npy) dan menyimpannya dalam variabel
light_sources.
Lalu, mengubah bentuk I menjadi array 2D. Mengubah bentuk dengan mengonversi array
3D I menjadi array 2D I_reshaped di mana setiap baris sesuai dengan piksel di semua gambar,
dan setiap kolom sesuai dengan gambar yang berbeda.
Membuat matriks L yang merepresentasikan sumber cahaya dari file biner NumPy. Kode
ini mengasumsikan bahwa matriks L memiliki bentuk (7, 3), yang berarti terdapat tujuh sumber
cahaya dan tiga komponen untuk setiap sumber tersebut.
Menyusun solusi untuk sistem persamaan linear guna memperkirakan matriks pseudo-
normal. Dalam kode diatas, metode kuadrat terkecil np.linalg.lstsq digunakan untuk
menyelesaikan sistem persamaan linear, dan sebagai hasilnya, matriks pseudo-normal B
diperkirakan. Adapun transposisi dari matriks L digunakan untuk memastikan kesesuaian dengan
dimensi matriks input yang dibutuhkan oleh metode tersebut. Lalu, normalisasi matriks pseudo-
normal ( B ) untuk mendapatkan albedo dan normal.
Albedo A dihitung dengan mengambil norma sepanjang sumbu pertama dari B, dan
matriks normal N diperoleh dengan membagi setiap kolom B dengan elemen yang sesuai di
A.Kemudian, menampilkan albedo dan nilai normal yang dipulihkan
Kode pada gambar diatas digunakan untuk memvisualisasikan hasil pemulihan albedo
dan nilai normal dengan menggunakan pustaka Matplotlib. Subplot pertama menampilkan
gambar albedo, sementara subplot kedua menampilkan nilai normal yang telah dipulihkan.Lalu,
memprediksi penampilan di bawah arah cahaya baru.
Pada kode tersebut terdapat proses prediksi penampilan wajah di bawah arah cahaya
baru. Arah cahaya baru didefinisikan dalam array new_light_directions, dan matriks albedo A
diubah bentuknya untuk memastikan dimensi yang sesuai dalam perhitungan selanjutnya.
Dilakukan perhitungan dot product antara matriks albedo A dan matriks normal N untuk arah
cahaya baru, hasilnya disimpan dalam matriks new_B, yang kemudian diubah bentuk untuk
memenuhi dimensi yang sesuai. Proses berikutnya melibatkan perhitungan ulang gambar wajah
menggunakan matriks new_B dan matriks pencahayaan asli L, dan hasilnya disimpan dalam
new_I_flat. Langkah terakhir adalah mengubah kembali bentuk new_I_flat untuk cocok dengan
bentuk gambar asli dan menampilkan gambar wajah yang dihasilkan kembali. Tahap ini
memberikan detail yang mendalam tentang mekanisme prediksi penampilan wajah di bawah arah
cahaya baru.
Pada bagian lainnya, fokus kode berpindah ke pemulihan permukaan objek dengan
menggunakan integrasi normal. Fungsi utama yang terlibat dalam proses ini adalah
integrate_frankot dan integrate_1d. Selanjutnya, hasil dari pemulihan permukaan ditampilkan
visual dengan menggunakan matriks kedalaman (Z) yang dihasilkan dari fungsi integrasi normal
sebelumnya.
Integrate_frankot adalah fungsi yang menerima turunan kedua dari komponen normal
terhadap koordinat x (fx) dan y (fy). Dalam prosesnya, komponen z normal (N[2]) dinormalisasi
untuk memastikan stabilitas dalam perhitungan. Setelah normalisasi, turunan kedua ini
digunakan untuk menghitung turunan kedua parsial, yakni fxx, fyy, dan fxy.
Integrate_1d merupakan komponen integral dari proses integrasi normal yang digunakan
untuk menghitung integral satu dimensi dengan menerapkan metode jumlah kumulatif. Integrasi
ini diaplikasikan pada turunan kedua yang telah dihitung sebelumnya. Hasil dari integrasi ini
menghasilkan nilai Zxx, Zyy, dan Zxy. Setelah itu, nilai-nilai ini digunakan untuk menghitung
matriks kedalaman (Z) yang merepresentasikan bentuk permukaan objek. Langkah berikutnya,
melibatkan tampilan dari permukaan yang telah dipulihkan. Pada tahap ini, permukaan objek
dipulihkan dan secara visual ditampilkan dengan menggunakan matriks kedalaman (Z) yang
dihasilkan dari fungsi integrasi normal sebelumnya.
Dalam bagian kode ini, nilai Z dihasilkan dengan memanggil fungsi integrate_frankot
pada komponen normal N[0] dan N[1]. Fungsi tersebut memanfaatkan integrasi normal untuk
menghasilkan matriks kedalaman yang mencerminkan struktur permukaan objek. Matriks
kedalaman Z kemudian diubah bentuk agar sesuai dengan format gambar asli menggunakan
fungsi reshape. Tahapan terakhir melibatkan visualisasi gambar permukaan yang telah dipulihkan
dengan menggunakan Matplotlib. Konfigurasi tampilan ini mencakup penyesuaian ukuran
gambar (figsize), pemilihan peta warna (cmap), serta memberikan judul (title) pada tampilan
hasilnya.
Output :
Penjelasan Output :
Gambar pertama dalam rangkaian tersebut adalah representasi visual dari reflektansi
permukaan objek, di mana setiap piksel mencerminkan sejauh mana setiap bagian dari objek
memantulkan cahaya. Gambar kedua, yang disebut sebagai "Recovered Normals,"
menggambarkan orientasi normal permukaan objek pada setiap piksel, dengan warna-warna
mencerminkan arah dan sudut kemiringan dari permukaan objek tersebut. Informasi mengenai
Recovered Normals ini bermanfaat untuk menentukan cara cahaya memantul dari permukaan
objek. Gambar ketiga, yang diberi judul "Re-rendered Face Images," memperkirakan penampilan
objek di bawah arah cahaya yang baru. Proses re-rendering ini memberikan gambaran tentang
bagaimana objek akan terlihat ketika terpapar cahaya dari sudut yang berbeda, yang secara
efektif membantu dalam memprediksi penampilan objek di bawah kondisi pencahayaan yang
berubah. Terakhir, gambar keempat adalah hasil akhir dari rekonstruksi permukaan objek,
menciptakan visualisasi tiga dimensi dari objek yang dipulihkan berdasarkan informasi normal
dan cahaya yang telah diolah sebelumnya.
Lalu, mengatur Konstanta dan Matriks. Kode ini mendefinisikan beberapa konstanta dan
matriks untuk pengaturan render, seperti dimensi citra (h dan w), vektor pandang (v), dan
beberapa arah cahaya (l, l_up, l_right, l_75_right), serta albedo objek (albedo).
Yang terakhir adalah Fungsi Untuk Menampilkan Hasil Render. Fungsi ini digunakan
untuk menampilkan hasil render dalam subplot matplotlib.
Bagian 1
Source Code :
Output :
Melalui langkah-langkah tertentu, implementasi ini menggunakan parameter Blinn-Phong
yang baru dengan nilai koefisien difusi maksimal (kd_3 = 1.0), koefisien spekular nol (ks_3 =
0.0), dan eksponen spekular satu (alpha_3 = 1). Langkah berikutnya adalah melakukan rendering
gambar objek untuk berbagai arah sumber cahaya, dengan tujuan untuk mengamati dampak dari
parameter Blinn-Phong yang baru terhadap hasil render. Selanjutnya, proses fotometri stereo dan
integrasi permukaan diterapkan untuk menganalisis hasil render dari arah sumber cahaya yang
berbeda, menghasilkan peta albedo dan model permukaan objek. Dengan demikian, penggunaan
parameter Blinn-Phong yang baru memungkinkan pengamat untuk mengamati secara langsung
bagaimana perubahan nilai koefisien difusi, koefisien spekular, dan eksponen spekular
memengaruhi representasi visual dan geometri objek. Keseluruhan implementasi ini memberikan
wawasan mendalam tentang peran parameter Blinn-Phong dalam merender objek 3D dan
bagaimana setiap pengaturan dapat mempengaruhi hasil visual dan informasi geometris yang
dihasilkan.