Tuesday, December 13, 2011

Image Processing using PIL Module on Python

Python has capability to get information of every pixel of an image an save it as array. With that, we can modify an image with unlimited posibility. To be able to used this features, we have to import a module named Image (we must install PIL first). There is no Python2.7's PIL module on My Mac OS X Lion yet.

 Here's some result from my Snow Leopard using Python2.5.

The image below is original image that'll be processed to black and white, negative, log and gamma transformation
From Blogsy Photos


Here's the code (ignore the comments, I used it for paper several years ago )

print 'Program Image Enchancement'
print 'Oleh Nugroho Adi Pramono'
print '==========================='
'''Komentar diantara tiga-tanda petik tidak akan dibaca
oleh python'''
#komentar setelah tanda pagar juga tidak di baca oleh python
import Image        #memanggil modul untuk olah gambar
import os,sys       #memanggil modul untuk mengakses file
import numpy as np  #memanggil modul untuk operasi matematika matrik/array
gb = Image.open('gambar.jpg')                   #memasukkan gambar ke variabel gb
print 'format awal: ' ,gb.format, "%dx%d" % gb.size, gb.mode
print 'konversi ke grayscale'
gbw = gb.convert("L")
gbw.save('gambarBW.jpg')                #simpan hasil konversi ddg nama gambarBW.jpg
gbw = Image.open('gambarBW.jpg')        #masukkan gambar grayscale hasil konversi ke variabel gbw
print 'format: ',gbw.format, "%dx%d" % gbw.size, gbw.mode
ukuran=gbw.size                         #mengambil nilai resolusi gambar
'''buat array r dan s berukuran sama dengan ukuran gambar'''
r=np.zeros((ukuran[0],ukuran[1]),dtype=np.integer)
s=np.zeros((ukuran[0],ukuran[1]),dtype=np.integer)
print 'Mengambil nilai piksel, masukkan ke array r'
for i in range (ukuran[0]):
    for j in range (ukuran[1]):
        r[i,j]=gbw.getpixel((i,j))

print 'Mengolah gambar: Image Negatives'
s=np.add(255,-r)        #kurangi 255 dengan setiap elemen array r, hasilnya masukkan ke array s
for i in range (ukuran[0]):
    for j in range (ukuran[1]):
        gbw.putpixel((i,j),s[i,j])      #letakkan pixel yang telah dimodifikasi ke posisi i,j
print 'Menyimpan gambar negative'
gbw.save('gambarNegative.jpg')          #simpan dengan nama gambarNegative.jpg
print 'Gambar negative tersimpan'

print 'Mengolah gambar: Log Transformation'
s=100*np.log10(1+r)     #c=100
for i in range (ukuran[0]):
    for j in range (ukuran[1]):
        gbw.putpixel((i,j),s[i,j])      #letakkan pixel yang telah dimodifikasi ke posisi i,j
print 'Menyimpan gambar hasil Log Transformation'
gbw.save('gambarLog.jpg')               #simpan dengan nama gambarLog.jpg
print 'Gambar hasil Log Transformation tersimpan'

print 'Mengolah gambar: Power-law Transformations, Gamma=0,6'
s=np.power(r,0.6)       #c=1 gamma=0.6
for i in range (ukuran[0]):
    for j in range (ukuran[1]):
        gbw.putpixel((i,j),s[i,j])      #letakkan pixel yang telah dimodifikasi ke posisi i,j
print 'Menyimpan gambar hasil Power-Law Transformation'
gbw.save('gambarPowGamma0p6.jpg')       #simpan dengan nama gambarPowGamma0p6.jpg
print 'Gambar hasil Power-Law Transformation tersimpan'

print 'Mengolah gambar: Power-law Transformations, Gamma=2,5'
s=np.power(r,2.5)       #c=1 gamma=2.5
for i in range (ukuran[0]):
    for j in range (ukuran[1]):
        gbw.putpixel((i,j),s[i,j])      #letakkan pixel yang telah dimodifikasi ke posisi i,j
print 'Menyimpan gambar hasil Power-Law Transformation'
gbw.save('gambarPowGamma2p5.jpg')       #simpan dengan nama gambarPowgamma2p5
print 'Gambar hasil Power-Law Transformation tersimpan'

print 'Program Selesai'
Here the result

Black and White
From Blogsy Photos
Log
From Blogsy Photos
Negative Image
From Blogsy Photos
Gamma
From Blogsy Photos
From Blogsy Photos