İyi bir karşılaştırma, “en hızlı kütüphane hangisi?” sorusuyla değil, aynı görüntü işini aynı donanım ve veri koşullarında hangisinin daha uygun yaptığıyla başlar. Önce işlemleri belirleyin; ardından API kullanımını, çıktı doğruluğunu, çalışma süresini, bellek tüketimini ve proje bağımlılıklarını aynı örnek üzerinde ölçün. Böylece tek bir kazanan aramak yerine projenize uygun kütüphaneyi seçebilirsiniz.
Görüntü işleme kütüphaneleri farklı amaçlara göre tasarlanır. Pillow, temel görüntü okuma, dönüştürme, yeniden boyutlandırma ve kaydetme işlerinde sade bir arayüz sunar. OpenCV, bilgisayarlı görü, kamera akışı, filtreleme, kenar ve şekil tespiti gibi işlemlerde daha geniş bir araç seti sağlar. scikit-image, NumPy dizileriyle çalışan bilimsel görüntü işleme algoritmaları için uygundur. imageio ise görüntü ve video dosyalarını okumak ve yazmak için daha dar kapsamlı bir seçenek olarak değerlendirilebilir.
Aynı görevi karşılaştırırken şu ölçütleri ayrı ayrı inceleyin:
Aşağıdaki tablo, ilk seçimi daraltmak için kullanılabilir. Bu bir hız sıralaması değildir; aynı görevde sonuç, görüntü boyutuna, kullanılan yönteme ve donanıma göre değişebilir.
Örneğin yalnızca kullanıcıdan alınan resmi açıp küçültecek ve JPEG olarak kaydedecekseniz Pillow daha doğrudan bir seçim olabilir. Kameradan kare alıp hareket veya nesne analizi yapacaksanız OpenCV’nin araçları daha uygun olabilir. Bilimsel bir çalışmada eşikleme, bölütleme veya morfolojik işlemleri NumPy dizileriyle birlikte uygulayacaksanız scikit-image değerlendirilebilir. Bu seçimler, her kütüphanenin her işlemde diğerlerinden kesin olarak daha iyi olduğu anlamına gelmez.
Ön koşul olarak aynı Python ortamında Pillow ve tek bir OpenCV dağıtımı bulunmalıdır. Yeni bir sanal ortamda
Kod iki ortalama süreyi yazdırır; kaydedilen çıktıları yeniden açıp boyut ve kanal kontrollerini
Yöntem ve parametre ayrıntıları için Pillow yeniden boyutlandırma belgesi, Pillow JPEG ayarları, OpenCV yeniden boyutlandırma belgesi ve OpenCV dosya yazma ayarları kullanılabilir.
Dosya işlemleri ve temel dönüşümler baskınsa API sadeliği ve bakım kolaylığı genellikle hız kadar önemlidir. Gerçek zamanlı kamera veya video akışında gecikme, kare işleme süresi ve bellek kullanımı daha belirleyici olur. Bilimsel analizde ise yalnızca süreyi değil, algoritmanın ürettiği sonuçların doğruluğunu ve NumPy tabanlı iş akışına uyumunu da değerlendirin.
Karşılaştırmayı tamamladıktan sonra her kütüphane için aynı girdide şu bilgileri kaydedin: ortalama süre, çıktı çözünürlüğü, renk düzeni, bellek kullanımı ve başarısız işlemler. Son seçimi bu ölçümlerin yanı sıra projenin ana işine göre yapın. Basit dosya ve piksel işlemlerinde sadelik, ileri görüntü analizinde işlev kapsamı, yoğun iş akışlarında ise doğrulanmış performans öncelikli ölçüt olmalıdır.
Karşılaştırmayı hangi ölçütlerle yapmalısınız?
Görüntü işleme kütüphaneleri farklı amaçlara göre tasarlanır. Pillow, temel görüntü okuma, dönüştürme, yeniden boyutlandırma ve kaydetme işlerinde sade bir arayüz sunar. OpenCV, bilgisayarlı görü, kamera akışı, filtreleme, kenar ve şekil tespiti gibi işlemlerde daha geniş bir araç seti sağlar. scikit-image, NumPy dizileriyle çalışan bilimsel görüntü işleme algoritmaları için uygundur. imageio ise görüntü ve video dosyalarını okumak ve yazmak için daha dar kapsamlı bir seçenek olarak değerlendirilebilir.
Aynı görevi karşılaştırırken şu ölçütleri ayrı ayrı inceleyin:
- İşlev kapsamı: Kütüphane yalnızca dosya ve piksel işlemleri mi yapıyor, yoksa nesne, kenar, hareket veya video analizi gibi daha ileri işlemleri de destekliyor mu?
- API açıklığı: Sık kullanılacak işlemler az kodla ve anlaşılır biçimde yapılabiliyor mu?
- Veri biçimi: Kütüphane NumPy dizileriyle, renk kanallarıyla ve farklı piksel türleriyle nasıl çalışıyor?
- Performans: Aynı boyuttaki görüntülerde çalışma süresi ve bellek kullanımı nasıl değişiyor?
- Çıktı doğruluğu: Yeniden boyutlandırma, renk dönüşümü veya filtreleme sonrasında beklenen görsel sonuç korunuyor mu?
- Proje uyumu: Kütüphanenin bağımlılıkları, mevcut kod yapınız ve dağıtım ortamınızla uyumlu mu?
Kütüphaneleri kullanım amacına göre ayırın
Aşağıdaki tablo, ilk seçimi daraltmak için kullanılabilir. Bu bir hız sıralaması değildir; aynı görevde sonuç, görüntü boyutuna, kullanılan yönteme ve donanıma göre değişebilir.
| Kütüphane | Öne çıkan kullanım | Güçlü yönü | Dikkat edilmesi gereken |
|---|---|---|---|
| Pillow | Dosya, renk, boyut ve temel piksel işlemleri | Sade ve okunabilir API | İleri bilgisayarlı görü işlemleri için kapsamı sınırlı kalabilir |
| OpenCV | Bilgisayarlı görü, kamera ve video işlemleri | Geniş algoritma ve gerçek zamanlı işleme seçenekleri | Renk kanalı ve veri türü dönüşümleri dikkat ister |
| scikit-image | Bilimsel ve algoritmik görüntü işleme | NumPy tabanlı analiz akışlarıyla uyum | Temel dosya işlemleri için daha kapsamlı görünebilir |
| imageio | Görüntü ve video okuma-yazma | Girdi-çıktı işlemlerinde pratiklik | Tek başına tam bir bilgisayarlı görü çözümü değildir |
Aynı işlemi ölçerek karşılaştırın
Ön koşul olarak aynı Python ortamında Pillow ve tek bir OpenCV dağıtımı bulunmalıdır. Yeni bir sanal ortamda
python -m pip install Pillow opencv-python-headless komutu bu örnek için yeterlidir; mevcut ortamda başka bir OpenCV dağıtımı varsa aynı cv2 ad alanını kullanan ikinci dağıtımı eklemeyin. Yönü önceden düzeltilmiş, EXIF Orientation etiketi taşımayan aynı JPEG girdisini kullanın; Python ve kütüphane sürümlerini kaydedin. Aşağıdaki örnek açma, gri tona çevirme, 800 × 600 boyutlandırma ve JPEG kaydetme akışını ölçer. İki tarafta bilinear yeniden örnekleme ve 95 JPEG kalite ayarı açıkça seçilmiştir. Süre değerleri donanıma göre değişir; bu bir ölçüm yöntemidir.- Aynı girdiyi seçin. Örneğin
ornek.jpgadlı, sabit çözünürlüklü bir görüntüyü her iki uygulamaya da verin. Farklı görüntüler kullanırsanız ölçüm, kütüphaneler yerine girdilerin farkını yansıtabilir. - Aynı işlemleri iki ayrı işlevde uygulayın. Renk dönüşümü, yeniden boyutlandırma ve çıktı biçimini iki tarafta da mümkün olduğunca eşleştirin.
- Her işlevi birkaç kez çalıştırın. İlk çalıştırmayı ısınma için ayırın, sonraki çalıştırmaların ortalama süresini ölçün. Tek ölçümden performans sonucu çıkarmayın.
- Çıktıları doğrulayın. Oluşan dosyaların gerçekten kaydedildiğini, çözünürlüklerinin aynı olduğunu ve renklerin ters görünmediğini kontrol edin. Süre daha kısa olsa bile görüntü yanlışsa sonuç başarılı sayılmaz.
Python:
from time import perf_counter
def pillow_islemi(girdi, cikti):
from PIL import Image
with Image.open(girdi) as image:
image = image.convert("L")
image = image.resize((800, 600), resample=Image.Resampling.BILINEAR)
image.save(cikti, format="JPEG", quality=95)
def opencv_islemi(girdi, cikti):
import cv2
image = cv2.imread(str(girdi), cv2.IMREAD_COLOR)
if image is None:
raise FileNotFoundError(f"Görüntü okunamadı: {girdi}")
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.resize(image, (800, 600), interpolation=cv2.INTER_LINEAR)
if not cv2.imwrite(str(cikti), image, [cv2.IMWRITE_JPEG_QUALITY, 95]):
raise OSError(f"Görüntü kaydedilemedi: {cikti}")
def olc(fonksiyon, tekrar=5):
sureler = []
for _ in range(tekrar):
baslangic = perf_counter()
fonksiyon()
sureler.append(perf_counter() - baslangic)
return sum(sureler) / len(sureler)
olc(lambda: pillow_islemi("ornek.jpg", "pillow_cikti.jpg"), tekrar=1)
olc(lambda: opencv_islemi("ornek.jpg", "opencv_cikti.jpg"), tekrar=1)
pillow_sure = olc(lambda: pillow_islemi("ornek.jpg", "pillow_cikti.jpg"))
opencv_sure = olc(lambda: opencv_islemi("ornek.jpg", "opencv_cikti.jpg"))
print(f"Pillow ortalama süre: {pillow_sure:.4f} saniye")
print(f"OpenCV ortalama süre: {opencv_sure:.4f} saniye")
from PIL import Image
import cv2
with Image.open("pillow_cikti.jpg") as sonuc:
assert sonuc.size == (800, 600) and sonuc.mode == "L"
sonuc_cv = cv2.imread("opencv_cikti.jpg", cv2.IMREAD_UNCHANGED)
assert sonuc_cv is not None and sonuc_cv.shape == (600, 800)
print("İki çıktı da 800 x 600 boyutunda ve tek kanallı.")
Kod iki ortalama süreyi yazdırır; kaydedilen çıktıları yeniden açıp boyut ve kanal kontrollerini
assert ile doğrular. Sürelere dosya okuma, dönüşüm, boyutlandırma ve kaydetme dahildir. İşletim sistemi dosya önbelleği tekrarları etkileyebilir; farklı çalıştırmalarda sıra değiştirerek de ölçün. Daha kısa süre yalnız bu girdi ve ayarlar için bir sonuçtur. Aynı bilinear ve JPEG kalite ayarı, kütüphanelerin filtreleme, yuvarlama veya codec uygulamalarını birebir aynı yapmaz; çıktı kalitesini ayrıca değerlendirin.Yöntem ve parametre ayrıntıları için Pillow yeniden boyutlandırma belgesi, Pillow JPEG ayarları, OpenCV yeniden boyutlandırma belgesi ve OpenCV dosya yazma ayarları kullanılabilir.
Sonucu nasıl yorumlamalısınız?
Dosya işlemleri ve temel dönüşümler baskınsa API sadeliği ve bakım kolaylığı genellikle hız kadar önemlidir. Gerçek zamanlı kamera veya video akışında gecikme, kare işleme süresi ve bellek kullanımı daha belirleyici olur. Bilimsel analizde ise yalnızca süreyi değil, algoritmanın ürettiği sonuçların doğruluğunu ve NumPy tabanlı iş akışına uyumunu da değerlendirin.
Karşılaştırmayı tamamladıktan sonra her kütüphane için aynı girdide şu bilgileri kaydedin: ortalama süre, çıktı çözünürlüğü, renk düzeni, bellek kullanımı ve başarısız işlemler. Son seçimi bu ölçümlerin yanı sıra projenin ana işine göre yapın. Basit dosya ve piksel işlemlerinde sadelik, ileri görüntü analizinde işlev kapsamı, yoğun iş akışlarında ise doğrulanmış performans öncelikli ölçüt olmalıdır.