Saya mendapat tugas untuk melakukan suatu proses Image Processing selama 3 bulan. Untuk langkah awal, saya mencoba membuat gambar menjadi grayscale. Grayscale adalah dimana gambar hanya berupa array 1 dimensi yang tiap datanya bernilai 0-255 (tingkat kecerahan). Pada artikel ini saya akan menunjukan bagaimana melihat nilai array pada sebuah gambar, melakukan grayscaling dengan fungsi pada OpenCV, Algoritma 1 yang aku buat, Algoritma 2 yang aku buat dan tabel komparasi kecepatan. Semua program yang dibahas akan menggunakan bahasa Python dan library OpenCV.
Pertama tentang bagaimana mengetahui nilai yang ada pada suatu gambar. Hal pertama yang perlu diketahui adalah pada OpenCV (sejauh yang saya pelajari) terdapat 3 macam sistem pewarnaan, yaitu grayscale ( 1 dimensi array), BGR ( 3 dimensi Array) dan CMYK (4 dimensi array). Sebagai gambaran, berikut adalah contoh gambar yang aku buat (random color) menggunakan program phyton.

[[ 36 104 177]
[124 91 4]
[ 69 75 85]
[213 53 103]
[ 12 90 242]
[186 73 76]
[178 38 191]
[ 91 173 75]]
Sebagai gambaran, diatas menggunakan format BGR dan kode diatas adalah nilai array untuk baris bertama. Dimana setiap baris kode murupakan nilai representasi Blue, Green, Red dari setiap kotak. Untuk melihat lebih jelas gambar yang dimaksud silahkan di download.

[[ 10]
[ 37]
[ 96]
[192]
[130]
[ 57]
[118]
[ 71]]
Gambar diatas bukan hasil grayscale gambar sebelumnya, tetapi merupakan gambar random yang lain tetapi menggunakan format grayscale. Angka diatas adalah untuk baris pertama saja. Dapat dilihat bahwa angka setiap baris kode hanya terdapat satu, ini berbeda dengan format BGR. Tujuan kita dalam melakukan proses grayscale adalah mengubah gambar pertama menjadi seperti gambar kedua. Untuk dapat melakukannya, diperlukan pengetahuan tentang bagaimana mendapatkan nilai grayscale pada setiap piksel.
NB: Untuk melihat nilai array yang dikandung dalam gambar, cukup load gambar dalam sebuah variabel dan print variabel tersebut.
import cv2 import numpy img = cv2.imread("/path/to/image.png") print img
Menggunakan fitur pada OpenCV
Penggunaan fitur ini sangat gampang, yaitu hanya menambah parameter pada saat kita me-load gambar kedalam variabel
img = cv2.imread("/path/to/image.png", cv2.CV_LOAD_IMAGE_GRAYSCALE)
Algoritma 1
Untuk bisa membuat gambar menjadi grayscale, ada banyak algoritma yang dapat digunakan. Website ini cukup bagus untuk menjadi referensi http://www.tannerhelland.com/3643/grayscale-image-algorithm-vb6/ . Pada program yang saya buat, saya melakukan filter dengan cara luminance yaitu dengan mengkomputasi nilai dengan equation berikut ini
img[j,i] = 0.21*r[j,i] + 0.72*g[j,i] + 0.07*b[j,i]
Pada algoritma pertama, aku melakukan looping dari setiap piksel dan melakukan komputasi satu persatu. Sebelumnya, gambar aku ekstrak menjadi nilai R,G dan B saja.
srcurl = "img/image-resize.jpg" src = cv2.imread(srcurl) x, y = src.shape[1],src.shape[0] # take the resolution (row, column) b, g, r = cv2.split(src) # split image to variable b, g and r src3 = b i = 0 j = 0 while i != x : # if the resolution in x not complete while j != y : # if the resolution in y not complete src3[j,i] = 0.21*r[j,i] + 0.72*g[j,i] + 0.07*b[j,i] j += 1 i += 1 j = 0 print src3
Algoritma 2
Algoritma 1 sangat lambat karena menggunakan perhitungan satu persatu dalam sebuah piksel. Saya mencoba untuk menconvert gambar 800×600 memerlukan waktu sekitar 9 detik (perhitungan timestamp, code dihapus di code diatas). Dengan metode yang sama, saya mencoba menggunakan cara lain
x, y = src.shape[1],src.shape[0] # take the resolution (row, column) b, g, r = cv2.split(src) src3 = numpy.round(0.21*r + 0.72*g + 0.07*b).astype('int') # Changed from while looping print src3
Saya mencoba menghilangkan iterasi dan langsung mengkalkulasi sebuah array. Sebelumnya saya lupa kalau di python bisa melakukan proses seperti ini.
Perbandingan Kecepatan
Kecepatan disini dibandingakan saat proses filtering image saja. Gambar yang digunakan berukuran 800×600 piksel dan menggunakan gambar yang sama. Program dijalankan diatas mesin Intel Core 2 (T2400) @1.83GHz 2 CPU, Ram 3 GB, dan GPU ATI Mobility Radeon X1300 di Laptop IBM T60 dan menjalankan Windows 7 Professional (original).
Fitur OpenCV :
Begin 22:44:06.906000
After filtering 22:44:06.933000
Algoritma 1:
Begin 22:44:06.989000
after filtering 22:44:15.773000
Algoritma 2:
Begin 00:44:55.932000
after filtering 00:44:56.017000
Dilihat dari data tersebut, fitur OpenCV masih jauh lebih cepat dari program yang saya buat. Hal ini menunjukan kurang optimalnya program ini dan masih dapat di optimalkan di kemudian hari.
hi mas Tegar..
kontennya bagus.. sepertinya mas Tegar jago ya di pemrograman.. senang jika bisa saling membantu.. (y)
Hai, terima kasih sudah mengunjungi. Semoga bias saling membantu 🙂