import numpy as np
import matplotlib.pyplot as plt
#===============================================================================
# LANGKAH 1 - SIAPKAN MODEL 3D YANG AKAN DIHITUNG VOLUMENYA
#===============================================================================
panjang_ruang = 10 #km
lebar_ruang = 10 #km
tinggi_ruang = 10 #km
#===============================================================================
# LANGKAH 2 - BACA MODEL 3D
#===============================================================================
nama_file = "bukit.npy" # Nama file model 3D yang akan dihitung volumenya
voxel = np.load(nama_file)
voxel = voxel.astype(int)
row, col, depth, thickness = voxel.shape
# VISUALIZING CROSS CUT OF THE 3D MODEL
n = row
slice_1 = np.zeros(shape=(n, n, 3), dtype=np.uint8) # Template untuk potongan tiap slice
slice_2 = np.zeros(shape=(n, n, 3), dtype=np.uint8) # Template untuk potongan tiap slice
slice_3 = np.zeros(shape=(n, n, 3), dtype=np.uint8)
for i in range(0, n):
I = n - 1 - i
for j in range(0, n):
slice_1[I, j, :] = voxel[j, 399, i, :] # A Vertical cut with opposite z coordinate
for i in range(0, n):
I = n - 1 - i
for j in range(0, n):
slice_2[I, j, :] = voxel[200, j, i, :] # A Vertical with opposite z coordinate
for i in range(0, n):
for j in range(0, n):
slice_3[i, j, :] = voxel[i, j, 200, :] # A horizontal cut
plt.figure('A VERTICAL CROSS CUT OF THE 3D MODEL (1)', figsize=(3.5, 3.5))
plt.imshow(slice_1)
plt.figure('A VERTICAL CROSS CUT OF THE 3D MODEL (2)', figsize=(3.5, 3.5))
plt.imshow(slice_2)
plt.figure('A HORIZONTAL CROSS CUT OF THE 3D MODEL ', figsize=(3.5, 3.5))
plt.imshow(slice_3)
#===============================================================================
# LANGKAH 3- AMBIL INFORMASI JUMLAH VOKSEL KESELURUHAN
#===============================================================================
jumlah_semua_voksel = row * col * depth
print("Jumlah semua voksel = ", jumlah_semua_voksel)
plt.pause(1)
#===============================================================================
# LANGKAH 4 - : TENTUKAN KRITERIA PENGENALAN OBJEK BERDASARKAN WARNA VOKSEL
#===============================================================================
# Setelah menganalisis masalah programemr menentukan kondisi sbb ini
# Periksa untuk suatu piksel, jika Green + Red + Blue > threshold
# Maka voksel tersebut meruipakan elemen objek
#===============================================================================
# LANGKAH 5 - : TENTUKAN UKURAN ELEMEN TERKECIL
#===============================================================================
# Dengan pertimbangan bahwa sumber daya komputer memamadai, programmer
# menentukan ukuran elemen terkecil adalah 1 voksel
#===============================================================================
# LANGKAH 6 - : Lakukan scanning pada model sambil terapkan kriteria yang telah
# dibuat untuk mengenali apakah voksel merupakan elemen dari objek.
# HITUNG JUMLAH VOKSEL YANG MEMENUHI KRITERIA
#===============================================================================
threshold = 20
n = 0
for i in range(0, row):
for j in range(0, col):
print("i, j = ", i, j, "Jumlah voksel elemen sementara = ", n, ".")
for k in range(0, depth):
cek = int(voxel[i, j, k, 0]) + int(voxel[i, j, k, 1]) + int(voxel[i, j, k, 2])
if cek > threshold:
n = n + 1
print("")
#===============================================================================
#===============================================================================
# LANGKAH 7 : HITUNG VOLUME OBJEK
#===============================================================================
volume_ruangan = panjang_ruang * lebar_ruang * tinggi_ruang #km^3
volume_objek = (n/jumlah_semua_voksel) * volume_ruangan #km^3
print("========= HASIL KOMPUTASI INTEGRASI NUMERIK ==========")
print("")
print("Volume objek adalah", volume_objek, "km^3.")
plt.show()