Algoritma Perubah Gambar Menjadi Grayscale Menggunakan Python dan OpenCV

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.

Gambar 8x10 Piksel
Gambar 8×10 Piksel

[[ 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.

Gambar 10x8 Grayscale
Gambar 8×10 Grayscale

[[ 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.

Advertisements

2 thoughts on “Algoritma Perubah Gambar Menjadi Grayscale Menggunakan Python dan OpenCV

Pendapat anda

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s