Python Görüntü İşleme ve Düzgün Resim Küçültme Örneği

from PIL import Image

No module named PIL diye bir hata veriyorsa aşağıdaki şekilde python image kütüphanesini yükleyiniz. Kütüphaneyi yükleme ile değil de, doğrudan dosyaları kopyalarak sisteminize attıysanız alabilirsiniz. Kütüphanenin olduğu (PIL) dizinde çalışırsanız da hata almayaacksınız, çünkü python default olarak pythonu çalıştırdığınız dizini sys.patch e ekliyor. bu yüzden yine de aşağıdaki gibi yüklemenizde yarar var.

Yüklemek için;

sudo apt-get install python-imaging

apt-get yoksa;

yum install python-imaging

ile yükleyebilirsiniz.

Bir resim dosyası açın. tam yol girmeniz her zaman daha sağlıklı olur (.bmp,.jpg,.png,.gif)

imageFile = "/root/emre/snake.jpg"
imageObj = Image.open(imageFile)

Örnek bir resmi şu adresten indirebilirsiniz : snake.jpg

Resmin boyutlarını almak için .size diyoruz. bu bize 2 li bir dizi (array) döndürüyor.

data = imageObj.size
print "width(en) %s , height(boy) %s" %(data[0], data[1])

Bunları ileride kullanacaksak ayrı değişkene verebiliriz

imageWidth=data[0]
imageHeight=data[1]

Yeni en ve boy degerlerinin disaridan girilmesini isteyelim.

width = float(raw_input("En giriniz"))
height = float(raw_input("Boy giriniz"))

Aşağıda 4 farklı yeniden boyutlandırma algoritması var, 4 ü de resmi verilen boyutlarla yeniden boyutlandırıyor. Deneyip görebilirsiniz (algoritmaların türkçeleri biraz saçma oldu 🙂 )

im2 = imageObj.resize((int(width), int(height)), Image.NEAREST) # en yakın komşuluk metodu.
im3 = imageObj.resize((int(width), int(height)), Image.BILINEAR) # 2x2 lik ortamda lineer interpolasyon metodu
im4 = imageObj.resize((int(width), int(height)), Image.BICUBIC) # 4x4 ortamda Kübik interpolasyon metodu
im5 = imageObj.resize((int(width), int(height)), Image.ANTIALIAS) # aşağı ölçeklendirme filtreleme metodu (antialias)

Bu yeniden boyutlandırılmış resimleri çalıştığımız dizine kayıt edebiliriz.

im2.save("NEAREST.jpg")
im3.save("BILINEAR.jpg")
im4.save("BICUBIC.jpg")
im5.save("ANTIALIAS.jpg")

Resmin ilk hali üzerinden doğru ölçeklendirmek için bir resim algoritması aşağıdadır. Bu resmi eğip büzmez mevcut oranları korur, eski resmi girilen en boy oranları şeklindeki bir hayali diktörgenin içine sığdırır. Çarpma bölme ve oran işlemleri için float değerlere ihtiyacımız olduğundan integer olabeilcek verileri float() tan geçirmeyi unutmuyoruz.

if imageWidth>width or imageHeight > height :
	if imageWidth > imageHeight :
		finalWidth = width
		percent = float(width)/float(imageWidth)
		finalHeight = float(percent) * float(imageHeight)
	elif imageHeight >= imageWidth :
		finalHeight = height
		percent = float(height)/float(imageHeight)
		finalWidth = float(percent) * float(imageWidth)
elif imageWidth < = width and imageHeight < = height : 
	finalWidth = imageWidth
	finalHeight = imageHeight

Resim objesi resize işleminde integer değer aldığından oluştururken float olan verileri int() ten geçiriyoruz ve resmi kaydediyoruz.

print "yeni boyutlar %s %s" % (finalWidth,finalHeight)
newImage = imageObj.resize((int(finalWidth),int(finalHeight)), Image.NEAREST)
newImage.save("newImage.jpg")