OpenCv’de Resim Formatı ve Çözünürlük Değiştirme

Merhaba arkadaşlar, Mobilhanem.com sitemizde Python ile Görüntü İşleme Dersleri eğitim serisine kaldığımız yerden devam ediyoruz. Geçen dersimizde OpenCv’de Resim Çevçeveleme ve Çözünürlüğe Göre İşlem’den bahsettik. Python ile Görüntü İşleme dersinde bu hafta ise OpenCv’de Resim Formatı ve Çözünürlük Değiştirme‘den  bahsedeceğiz. Eğer bir önceki dersimizi inceleme fırsatınız olmadıysa OpenCv’de Resim Çevçeveleme ve Çözünürlüğe Göre İşlem dersimize buradan ulaşabilirsiniz. OpenCv’de Resim Formatı ve Çözünürlük Değiştirme işlemlerine başlamadan önce  OpenCv’de Temel İşlemler dersimizde işleyeceğimiz konu başlıklarımızı tekrar gözden geçirelim.

  • Resim Okuma ve Yazma İşlemleri
  • Resim Özellikleri
  • Resim Çerçeveleme İşlemi
  • Çözünürlüğe Göre Pencere Boyutlandırma
  • Format ve Çözünürlük Değiştirme
  • Resim üzerinde piramit oluşturma (Görüntü işleme durumlarına göre resim boyutlandırma)
  • Resime Dörtgen Ekleme
  • Resime Çizgi ve Daire Ekleme
  • Resime Metin Ekleme İşlemleri

OpenCv’de Resim Formatı ve Çözünürlük Değiştirme

OpenCv’de Temel İşlemler bölümü maddelerinde yer alan Şimdi OpenCv’de Resim Formatı ve Çözünürlük Değiştirme işlemlerine hep birlikte bakalım.

Yeni bir python dosyası oluşturarak çalışmamıza başlayalım. Yeni bir python dosyası oluşturduktan sonra gerekli kütüphanelerimizi çalışma dosyamıza dahil edelim.

import  cv2

Kütüphanemizi dahil ettikten sonra jpg’yi farklı kalitelerde kaydetme ve png ‘yi sıkıştırma yöntemi ile resim üzerinde nasıl işlem yaparız buna bakacağız.  Bu işlemlerimizi  resimKaydet  adında yeni bir fonksiyon içerisinde gerçekleştireceğiz.

import  cv2

def resimKaydet(path,image,jpg_quality=None,png_compress=None):
    if jpg_quality:
        cv2.imwrite(path,image,[int(cv2.IMWRITE_JPEG_QUALITY),jpg_quality])
    elif png_compress:
        cv2.imwrite(path,image,[int(cv2.IMWRITE_PNG_COMPRESSION),png_compress])
    else:
        cv2.imwrite(path,image)

Yukarıdaki resimKaydet fonksiyonunda  path (resmin yolu), image (resmin kendisi), jpg_quality (kalite değeri), dilersekte png sıkıştırması için png_compress parametrelerini tanımadık.  Ayrıca jpg kalitesi 0-100 arasında değer alır. 100 değeri en yüksek kaliteyi belirler. Varsayılan olarak bu kalite 95 değerini alır.

Fonksiyonumuzu incelediğimizde  jpg_quality değişkenine girilen bir kalite değeri var ise parametre üzerinden gönderdiğimiz resmimizi ve kalite değerimizi alıp cv.imwrite ile yeni resmimizin kayıt işlemini yapıyoruz. Eğer ki girilen parametremizde png_compress değeriyse de resmimizi png olarak sıkıştırma işlemini yapıyoruz. Şimdi resimKaydet  fonksiyonumuzu ana fonksiyonumuzda çağırıp kullanalım.

def main():
    resimYol="everest.jpg"
    resim=cv2.imread(resimYol)
    cv2.imshow('Everest',resim)

Bu kod bloğunda ise  yeni bir resmi okuduk ve resim değişkenine aktardık. Aktardığımız bu resmi cv2.imshow ile keyfi olarak ekranda gösteriyorum.

son_jpg="everestJPG.jpg"
resimKaydet(son_jpg,resim,jpg_quality=6)

Daha sonra son_jpg değişkenine dışarıya aktaracağımız yeni bir  resim yolu tanımladık. Kullanacağımız resmiKaydet fonksiyonuna resim yolumuz olan son_jpg , kalitesini değiştireceğimiz olan resmimizin olduğu resim değişkenini ve jpg kalitesi için 0-100 değerleri arasından belirlediğim 6 değerini parametre olarak gönderiyoruz.

son_png = "everestPNG.png"
resimKaydet(son_png,resim,png_compress=9)

Şimdi ise png sıkıştırması yapalım. Bu kısımda png sıkıştırma değerimiz 0-9 arasındadır. Maksimum olan 9 değeri ile dosyanın yüksek bir sıkıştırma yaparak daha küçük boyut elde edeceğimizi ifade ediyor.

import  cv2
import  numpy as np


def resmiKaydet(path,image,jpg_quality=None,png_compress=None):
    if jpg_quality:
        cv2.imwrite(path,image,[int(cv2.IMWRITE_JPEG_QUALITY),jpg_quality])
    elif png_compress:
        cv2.imwrite(path,image,[int(cv2.IMWRITE_PNG_COMPRESSION),png_compress])
    else:
        cv2.imwrite(path,image)


def main():
    resimYol="everest.jpg"
    resim=cv2.imread(resimYol)
    cv2.imshow('Everest',resim)

    son_jpg="everestJPG.jpg"
    resmiKaydet(son_jpg,resim,jpg_quality=6)

    son_png = "everestPNG.png"
    resmiKaydet(son_png,resim,png_compress=9)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__=="__main__":
    main()

Son olarak cv2.waitKey(0) , cv2.destroyAllWindows() fonksiyonlarını kullanalım. Böylelikle penceremiz ekranda sabit duracak ve herhangi bir tuşa bastığımızda tüm pencereleri kapatmış olacağız. Ana fonksiyonumuzu ekledikten sonra Run tuşuna basarak derleme işlemimizi yapalım.

Derleme Başarılı

 

Derleme başarılı bir şekilde gerçekleşti. Herhangi bir tuşa basarak açılan pencerelerimizi kapatalım.

mobilhanem_project
Project Alanı

Pencereler kapandıktan sonra sol kısımda bulunan Project  alanında  jpg resim üzerine png sıkıştırması yaptığımız  ve çözünürlük kalitesi değiştirilmiş birer  resim oluştu.  Gelin hep birlikte oluşan bu resimlerimizi inceleyelim.

 

mobilhanem_png
Uzantısı Değiştirilmiş Resim (JPG->PNG)

 

mobilhanem_resim_ilk_hali
Çözünürlük Kalitesinin İlk Hali

 

mobilhanem_resim_son_hali
Çözünürlük Kalitesinin Son Hali

 

Jpg uzantısına sahip olan everest adlı resmimize png sıkıştırması yaptık. Yaptığımız işlem ile çözünürlük kalitesini değiştirmeyi başardık. Ayrıca  kalitesine göre resmin dosya boyutunda değişme oldu. Fonksiyon parametreleri üzerinden verilen değerleri değiştirerek sizde çeşitli kaliteler elde edebilirsiniz.

Mobilhanem.com da Python ile Görüntü İşleme serisinde bir dersin daha sonuna geldik. Bu hafta Python ile Görüntü İşleme dersimizde OpenCv’de Resim Formatı ve Çözünürlük Değiştirme‘den bahsettik. Umarım sizin için faydalı bir yazı olmuştur. Bir sonraki  OpenCv ‘de Temel İşlemlerde devam edeceğimiz Resim üzerinde piramit oluşturma (görüntü işleme durumlarına göre resim boyutlandırma) dersinde görüşmek üzere. Eksik ya da yanlış gördüğünüz bir şey varsa lütfen iletişime geçmekten çekinmeyin.

Tüm Görüntü İşleme Dersleri için tıklayınız.

Kaynak : Link

7

Yunus Emre Aydın

Yazılım Mühendisi

9 Yorum

      • derslerin devamı var diyorsunuz
        Resim üzerinde piramit oluşturma dersi nerde bulamadım?

        • Merhaba Mustafa. Ders içerisinde gördüğünüz liste üzeriden sırasıyla gidilmektedir. Listede üstünü çizdiklerim yayınlanan derslerdir. Şuan Piramit oluşturma ve Resime Dörtgen Ekleme dersi hazırlanıyor. Birkaç gün içerisinde yayınlanacaktır.

  • Merhaba ben makine mühendisliği hazırlık sınıfıyım . Temel düzeyde python biliyorum ve bu yıl takımım ile teknofeste katılacağım ama görevim gereği görüntü işleme ile bir rengi tanıtmam gerekiyor. Bunu sizce opencv ile mi daha rahat yapabilirim yoksa keras ile mi ? Ayrıca bu işi yapabilmem için önerdiğiniz bir kaynak,ders,döküman varsa önerirmisiniz. Cevabınız için şimdiden teşekkürler.

    • Merhaba. Renk tespit olayınız yapay zeka içerecek ise tensorflow kütüphanesini öneririm. Tensorflow’da renkler ile ilgili oluşturucağınız eğitim veri seti ile F-RCNN derin öğrenme modeli ile eğitip tanıma işlemini yapabilirsiniz. Kaynak Link

      Eğer sadece renk tespiti üzerine çalışmak isterseniz opencv kütüphanesini kullanarak bu tespiti yapabilirsiniz. Kaynak Link 2

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?