Pola Geometri
Ciri geometri merupakan ciri yang didasarkan pada hubungan antara dua buah titik, garis, atau bidang dalam citra digital.
Ciri geometri di antaranya adalah jarak dan sudut.
Jarak antara dua buah titik (dengan satuan piksel) dapat ditentukan menggunakan persamaan euclidean, minkowski, manhattan, dll.
Jarak dengan satuan piksel tersebut dapat dikonversi menjadi satuan panjang seperti milimeter, centimeter, meter, dll dengan cara membaginya dengan resolusi spasial.
Sedangkan sudut antara dua buah garis dapat ditentukan dengan perhitungan trigonometri maupun dengan analisis vektor.
Dalam sistem koordinat citra dua dimensi, jarak antara dua objek dapat diukur menggunakan persamaan euclidean distance.
Berikut ini merupakan contoh aplikasi pemrograman matlab untuk mengukur jarak antara dua objek dalam citra phantom berformat dicom. Langkah-langkahnya adalah sebagai berikut:
1. Membaca citra phantom berformat dicom
3. Menentukan centroid dan labelling objek
4. Mengukur jarak antara dua objek menggunakan persamaan euclidean distance dalam satuan piksel. Satuan piksel kemudian dikonversi menjadi satuan mm dengan cara membagi hasil pengukuran jarak dalam satuan piksel dengan resolusi spasial (pada contoh ini diketahui resolusi spasial citra adalah sebesar 1,4798 piksel per mm). Pengukuran jarak antara objek 1 dengan objek 2 ditunjukkan pada gambar berikut:
5. Pengukuran jarak antara objek 1 dan objek 3
6. Pengukuran jarak antara objek 1 dan objek 4
7. Pengukuran jarak antara objek 2 dan objek 3
8. Pengukuran jarak antara objek 2 dan objek 4
9. Pengukuran jarak antara objek 3 dan objek 4
File source code lengkap beserta citra dicom pada materi di atas dapat diperoleh melalui halaman berikut ini: Source Code
Sedangkan tampilan source codenya adalah:
clc;clear;close all; I = dicomread('slice1.dcm'); figure(1), imshow(I,[]); BW = I>3000; figure(2), imshow(BW,[]); s = regionprops(BW, 'centroid'); centroids = cat(1,s.Centroid); % labelling [B,L] = bwboundaries(BW,'noholes'); [~,num] = bwlabel(BW,8); figure(3), imshow(I,[]) hold on for k = 1:num boundary = B{k}; text(boundary(1,2)+20,boundary(1,1),strcat(['Object ',num2str(k)]),'Color','y',... 'FontSize',14,'FontWeight','bold'); plot(centroids(:,1), centroids(:,2), 'b*') end hold off % object 1 & 2 x1 = centroids(1,1); y1 = centroids(1,2); x2 = centroids(2,1); y2 = centroids(2,2); figure(4), imshow(I,[]) hold on plot([x1;x2], [y1;y2], 'r','LineWidth',3) d_px = sum(([x1;y1]-[x2;y2]).^2).^0.5; res = 1.4798; d_mm = d_px/res; text((x1+x2+20)/2,(y1+y2)/2,strcat(['d = ',num2str(d_px),' px']),'Color','y',... 'FontSize',14,'FontWeight','bold'); text((x1+x2+20)/2,(y1+y2+40)/2,strcat(['d = ',num2str(d_mm),' mm']),'Color','y',... 'FontSize',14,'FontWeight','bold'); hold off % object 1 & 3 x1 = centroids(1,1); y1 = centroids(1,2); x3 = centroids(3,1); y3 = centroids(3,2); figure(5), imshow(I,[]) hold on plot([x1;x3], [y1;y3], 'g','LineWidth',3) d_px = sum(([x1;y1]-[x3;y3]).^2).^0.5; res = 1.4798; d_mm = d_px/res; text((x1+x3+20)/2,(y1+y3)/2,strcat(['d = ',num2str(d_px),' px']),'Color','y',... 'FontSize',14,'FontWeight','bold'); text((x1+x3+20)/2,(y1+y3+40)/2,strcat(['d = ',num2str(d_mm),' mm']),'Color','y',... 'FontSize',14,'FontWeight','bold'); hold off % object 1 & 4 x1 = centroids(1,1); y1 = centroids(1,2); x4 = centroids(4,1); y4 = centroids(4,2); figure(6), imshow(I,[]) hold on plot([x1;x4], [y1;y4], 'b','LineWidth',3) d_px = sum(([x1;y1]-[x4;y4]).^2).^0.5; res = 1.4798; d_mm = d_px/res; text((x1+x4+20)/2,(y1+y4)/2,strcat('d = ',[num2str(d_px),' px']),'Color','y',... 'FontSize',14,'FontWeight','bold'); text((x1+x4+20)/2,(y1+y4+40)/2,strcat(['d = ',num2str(d_mm),' mm']),'Color','y',... 'FontSize',14,'FontWeight','bold'); hold off % object 2 & 3 x2 = centroids(2,1); y2 = centroids(2,2); x3 = centroids(3,1); y3 = centroids(3,2); figure(7), imshow(I,[]) hold on plot([x2;x3], [y2;y3], 'c','LineWidth',3) d_px = sum(([x2;y2]-[x3;y3]).^2).^0.5; res = 1.4798; d_mm = d_px/res; text((x2+x3)/2,(y2+y3-60)/2,strcat(['d = ',num2str(d_px),' px']),'Color','y',... 'FontSize',14,'FontWeight','bold'); text((x2+x3)/2,(y2+y3-20)/2,strcat(['d = ',num2str(d_mm),' mm']),'Color','y',... 'FontSize',14,'FontWeight','bold'); hold off % object 2 & 4 x2 = centroids(2,1); y2 = centroids(2,2); x4 = centroids(4,1); y4 = centroids(4,2); figure(8), imshow(I,[]) hold on plot([x2;x4], [y2;y4], 'm','LineWidth',3) d_px = sum(([x2;y2]-[x4;y4]).^2).^0.5; res = 1.4798; d_mm = d_px/res; text((x2+x4+20)/2,(y2+y4)/2,strcat(['d = ',num2str(d_px),' px']),'Color','y',... 'FontSize',14,'FontWeight','bold'); text((x2+x4+20)/2,(y2+y4+40)/2,strcat(['d = ',num2str(d_mm),' mm']),'Color','y',... 'FontSize',14,'FontWeight','bold'); hold off % object 3 & 4 x3 = centroids(3,1); y3 = centroids(3,2); x4 = centroids(4,1); y4 = centroids(4,2); figure(9), imshow(I,[]) hold on plot([x3;x4], [y3;y4], 'y','LineWidth',3) d_px = sum(([x3;y3]-[x4;y4]).^2).^0.5; res = 1.4798; d_mm = d_px/res; text((x3+x4+20)/2,(y3+y4)/2,strcat(['d = ',num2str(d_px),' px']),'Color','y',... 'FontSize',14,'FontWeight','bold'); text((x3+x4+20)/2,(y3+y4+40)/2,strcat(['d = ',num2str(d_mm),' mm']),'Color','y',... 'FontSize',14,'FontWeight','bold'); hold off
Assalaamu’alaikum mas, saya mau nanya bagaimana cara menentukan diameter bangun datar tanpa menggunakan centroid mas?
Waalaikumsalam Melia
Dalam mengukur diameter bangun datar yaitu lingkaran, kita memang tidak perlu menggunakan centroid
Penghitungan kedua nilai tsb dilakukan secara terpisah
Kita bisa menghitung luas lingkaran terlebih dahulu kemudian menghitung diameter menggunakan persamaan
d = 2*sqrt(L/pi)
Assalamu alaikum Mas Adi
Bagaimana mengukur jarak fitur wajah manusia, seperti jarak antara 2 mata, hidung dan mulut?
Terima kasih sebelumnya.
Waalaikumsalam benny
materi untuk mengukur jarak antara dua buah objek dapat dilihat pada halaman berikut ini
https://pemrogramanmatlab.com/pengenalan-pola-citra-digital-menggunakan-matlab/pola-geometri/
assalamu alaikum mas, bagaiman untuk mengukur jarak antara kamera dan objek (manusia) ? terima kasih sebelumnya
waalaikumsalam evn
jarak antara kamera dengan objek bisa diukur menggunakan metode stereovision menggunakan kamera stereo
masalahnya mas saya pake webcam,
oh iya mas gimana caranya buat bounding box adaptif? yang bisa menyesuaikan dengan objek yang di deteksi. dalam hal ini saya akan ngedeteksi bahu, kalo di matlab ada detector upperbody kan ya? tapi saya hendak ngukur jarak bahu. makasih mas
jarak antara kamera dengan objek hanya bisa diukur menggunakan metode stereovision menggunakan kamera stereo
mas klau untuk source code euclidean distance nya sendiri itu yang mana mas?
Di atas terdapat source code euclidean distance dengan nama variabel d_px
mas kalau menghitung jarak paling bawah dan paling atas suatu objek itu caranya gmna ya mas ?
Bisa menggunakan perintah max(y)-min(y)
Mas, kalau format citra saya bmp trus merubah ke dicomnya bagaimana?
Format citra bmp tidak dapat dikonversi menjadi format dicom
Format dicom hanya dapat diperoleh dari hasil akuisisi citra menggunakan pesawat radiodiagnostik
mas kalau untuk membuat garis yg berwarna itu gmna caranya ya mas ?
saya mau pakai untuk di ciri panjang dan lebar
Bisa dipelajari pada source code di atas
maaf mau bertanya mas
gimana cara mengetahui besar sudutnya ya?
Mas mau tanya, kalau untuk kode diatas dapat dijalankan di matlab versi berapa saja ?
Bisa dijalankan pada semua versi