Resimlere Giriş

Created with Sketch.
  • Piksel dediğimiz verinin ne olduğunu öğreneceksiniz
  • Resmi okumak, göstermek ve kaydetmek için gerekli olan foksiyonları öğreneceksiniz: cv2.imread()cv2.imshow() , cv2.imwrite()
  • Resmi göreceğimiz pencereyi yönetmek için gerekli olan 2 fonksiyonu öğreneceksiniz: cv2.waitKey(), cv2.destroyAllWindows()

1. Piksel Nedir ?

OpenCV ile ilgilendiğimiz için resim dediğimizde aklımıza dijital ortamdaki görsel ögeler gelmelidir. Bu başlıkta dijital ortamlardaki resimleri oluşturan matematiksel yapıyı, yani pikselleri inceleyeceğiz. Bilgisayar bilimlerinin en ilgi çeken konularından görüntü işleme disiplininde pikseller oldukça önemli yer tutar. Dolayısıyla piksellerle ilgili bazı konuları net olarak anlamalıyız:

  • Pikseller bir resmi nasıl oluşturur ?
  • Piksel değişimlerinin bir resim üzerindeki etkileri nelerdir ?
  • OpenCV kullanarak pikselleri nasıl erişir ve onları nasıl manipüle ederiz ?

1.1 Öyleyse, Piksel Nedir ?

Pikseller, dijital bir görüntünün yapı taşlarıdır ve her resimde belirli miktarda piksel taneciği bulunur. 1 piksel bilgisayarımızdaki “nokta” işareti kadardır. İşte bu denli küçük taneciklerin yan yana ve alt alta dizilmesiyle resimler oluşur. Bu tanecikler aynı zamanda belirli özelliklere de sahiptirler. OpenCV fonksiyonlarıyla taneciklerin özelliklerine erişip bazı değişimler yaparız. Zaten görüntü işlemenin temelinde de bu işlem vardır. Piksellerin değiştirebileceğimiz en temel özelliği renkleridir. Dijital ortamda her bir renk, bir sayı ile ifade edilir.

Şimdilik hangi rengin hangi sayıya karşılık geldiğini öğrenmeden önce gelişigüzel bir sayı belirleyelim. Siyah için 0 ve beyaz için de 1 sayısını seçelim.

Bu aşamada bir örnek üzerinden ilerlememiz konuyu daha anlaşılır kılacaktır. Şimdi aşağıdaki resmi inceleyelim:

Gördüğünüz gibi yandaki resimde karelere bölünmüş bir T profilini var. Her bir karesel bölgenin bir pikseli ifade ettiğini varsayıyoruz. 4 tane yatay sıra, 3 tane de dikey sıra var. O halde,

Bu resimde kaç piksel var ?

3×4 = 12 piksel

Buraya kadar tamamsa, devam edelim.

Birinci sıra birinci sütundaki bölgeye bir adres vermemiz gerekiyor. Haydi buraya (1,1) diyelim. Şimdi bu pikselin adresi elimizde. (1,1) adresindeki pikselin rengi nedir ? Siyah, değil mi?

Hatırlarsanız siyah rengi için de 0 değerini seçmiştik. O halde (1,1) pikselindeki renk “0“dır.

İşte OpenCV’yi kullanarak aynı bu şekilde istediğimiz adresteki pikselin rengine bu şekilde erişir ve eğer istersek o rengi değişetirebiliriz de.

Örneğin, 0 (siyah) değerine sahip renge, 1 (beyaz) değerini atarız ve orası artık beyaz olur. Sizin de tahmin edebileceğiniz üzere resmin son hali aşağıdaki gibidir:

Bu örnekle birlikte piksel kavramına dair algılarınızın açıldığını düşünüyorum. Artık piksel nedir ve piksellerin özellikleri(rengi) nasıl manipüle edilir gibi soruların yanıtlarını biliyoruz.

Piksel ve piksel manipülasyonuyla ilgili konulara ileride değineceğiz, şimdilik pikselleri burada bırakalım ve OpenCV fonksiyonlarına giriş yapmaya başlayalım.

Dipçe : Her ne kadar sol-üst köşeye kafanızın karışmaması için (1,1) desekte, aslında orası (0,0) noktasıdır. Çünkü Python, sıfır indeksli bir dildir. Yani ilerde çalışmalarımızı yaparken sıfırdan başlayacağız.

2. OpenCV’yi Kullanma Vakti !

Yeterince teorik bilgiyi aldığımıza göre, şimdi biraz uygulama yapmaya başlayalım. Kazanımlar bölümünde sözü geçen fonksiyonları sırasıyla öğrenmeye başlayabiliriz. Örnek görselimiz aşağıdaki klon asker olacak.

Sizde internetten herhangi bir görsel indirerek kodları uygulayabilirsiniz.

2.1 Resimleri Okuma

Resimleri ekranda görmeden önce onları okumamız gerekir. Peki resimleri okumak ne demek ? Anadili Türkçe olan insanlar için bir resmi okumak garip bir deyim gibi gelebilir. Çünkü dil yapımız ve mantığımız gereği bir resmi görürüz, açarız veya ona bakarız, değil mi ? Ama aslında o kadar garip da değil. Çünkü resimden kastımız görsel ögelerin matematiksel arka planlarıdır. Yani pikselleri, renk değerleri vs. Bu değerlerin bir takım sayılarla ifade edildiğine yukarıda değinmiştik. İşte bilgisayarımızın resmi anlaması için önce o resmin matematiksel yapısını okuması gerekir.

Resimleri okumak için cv2.imread() fonksiyonunu kullanırız. Bu fonksiyon içerisine 2 argüman alır. Resmin adresi ve resmin okunacağı biçim. Biçimden kastımız; resmin boz(gri) tonlarda mı, yoksa normal şekliyle mi okunacağını belirlemektir.

Yani fonksiyon şu şekilde kullanılır: cv2.imread(adres,biçim)

Resimleri 3 farklı biçimde okuyabiliriz, bunlar:

  • cv2.IMREAD_COLOR : Fonksiyonun resmi varsayılan biçimde okumasını sağlar.
  • cv2.IMREAD_GRAYSCALE : Fonksiyonun resmi varsayılan boz(gri) biçimde okumasını sağlar.
  • cv2.IMREAD_UNCHANGED : Fonksiyonun resmi alfa kanalıyla birlikte okumasını sağlar. Pek yaygın bir kullanımı yoktur.

1. Dipçe: Tüm bu uzun argümanları fonksiyon içine yazmak gözünüzü korkutuyor olabilir ama korkmayın, bu argümanların yerine basitçe 1,0,-1 kullanabilirsiniz.

2. Dipçe: Resmi normal olduğu gibi okutacaksanız, bu argümanları kullanmanıza gerek yok. Doğrudan adresi yazarak okutabilirsiniz.

Şimdi kod içerisinde kullanıma bakalım:

import cv2 

img = cv2.imread('klon.jpg')

Bu aşamada bir doğrulama işlemi yapmanızı istiyorum. print(img) yazıp çalıştırın eğer None çıktısı alıyorsanız, resim okunamamış demektir. Resmin adresini, adını ve uzantısını doğru yazdığınızdan emin olun.

Benim resmim ve proje dosyam aynı adreste olduğundan sadece resmin adı ve uzantısını yazmam yeterli.

Doğrulama işlemini yaptıysanız muhtemelen yandaki gibi bir çıktı ile karşılaşacaksınız. Bu yazıdaki temel amacımızdan sapmamak için bu kısmın, resmin, piksel ve renk korelasyonuyla ilgili olduğunu söyleyerek atlıyorum. İlerde daha ayrıntılı konuşacağız.

Temel olarak bilmeniz gereken şey, bilgisayarımızın resmi anladığıdır. Bu kısmı da anladığımıza göre devam edebiliriz.

2.2 Resimleri Gösterme

Şimdi cv2.imread() ile okuduğumuz bu resmi görme zamanı geldi. Bunun için cv2.imshow() kullanırız. Bu fonksiyon içerisine 2 adet argüman alır. Birincisi resmin yerleştirileceği pencerenin adı, ikincisi ise resmin tutulduğu değişkendir.

Yani fonksiyon şu şekilde kullanılır: cv2.imshow(pencerenin adı,resmin bulunduğu değişken)

Yukarıdaki kodlara ekleyerek devam ediyorum:

import cv2

img = cv2.imread('klon.jpg')

cv2.imshow("image",img)

Bu aşamada bu kodları koşturduğumuzda, ekranda hiçbir şey göremeyeceğiz. Resim, çok kısa bir süre gösterilip hemen kapanacaktır. O halde 2 fonksiyon daha ekleyelim ve resmimizi ekranda tutalım:

import cv2 

img = cv2.imread('klon.jpg')

cv2.imshow("Image",img)
cv2.waitKey(0) 
cv2.destroyAllWindows()

Kodları çalıştırdığınızda muhtemelen şöyle bir ekranla karşılaşacaksınız:

cv2.waitKey() fonksiyonu klavyeden aldığı komutları yerine getirir. İçerisine 1 argüman alır ve bu bir sayıdır. Fonksiyon, resmimizi girdiğimiz milisaniye kadar ekranda tutar. Peki bir milisaniye kaç saniyedir?

1 Milisaniye = 0.001 Saniye

Örneğin biz 1 dk durmasını istiyoruz o halde çok uzun bir sayı mi gireceğiz ? Hayır, bu zorluğu aşmanın bir yolu var. Yukarıdaki kodlardaki gibi sıfır yazarsanız resim siz klavyeden bir düğmeye basana kadar ekranda kalacaktır. Siz de bu şekilde kullanabilirsiniz.

cv2.destroyAllWindows()

ise işlemleriniz bittiğinde tüm pencereleri kapatır. Görevi basitçe budur.

Dipçe: Bazı özel durumlar için önce penceremi oluşturup daha sonra resmi o pencereye yükleyebiliyorum. Bunun için cv2.namedWindow() fonksiyonunu kullanabilirim, ayrıca bu fonksiyonun içerisine flag olarak cv2.WINDOW_NORMAL girersem, pencerem artık yeniden boyutlandırılabilir hale geliyor.

Bu kodu cv2.imshow(“Image”,img) fonksiyonundan önceki herhangi bir yere, örneğin kütüphanelerin hemen altına yerleştirebilirsiniz.

cv2.namedWindow('image', cv2.WINDOW_NORMAL)

2.3 Resimleri Kaydetme

Rsimleri kaydetmek için cv2.imwrite() fonksiyonunu kullanırız ve bu fonksiyon 2 argüman alır. Birincisi, resmi kaydetmek istediğimiz ad ve adres, ikincisi resmin saklı tutulduğu değişken.

Yani fonksiyon şu şekilde kullanılır: cv2.imwrite(yeni ad,resmin tutulduğu değişken)

Bu foksiyonu tam olarak cv2.imwrite() fonksiyonunun altına yerleştireceğim, siz de öyle yapabilirsiniz:

import cv2 

img = cv2.imread('klon.jpg')

cv2.imshow("Image",img)
cv2.imwrite("klon1.jpg",img)

cv2.waitKey(0)
cv2.destroyAllWindows()

Proje dosyama baktığımda aşağıdaki gibi yeni dosyayla karşılaştım:

Şimdi bu kodları çalıştırıp her şeyin sorunsuz çalışıp çalışmadığını kontrol edin. Eğer bir sorun varsa, yazıma tekrardan göz atabilir; kısa bir Google araştırması yapabilir veya aşağıdan sorularınızı yazabilirsiniz.

3. Özet

Buraya kadar yaptıklarımızı özetleyecek olursak, yazdığımız programla resmi okuduk, ekranda gösterdik ve kaydettik.

import cv2 

img = cv2.imread('klon.jpg')

cv2.imshow("Image",img)
cv2.imread("klon1.jpg",img)

cv2.waitKey(0)
cv2.destroyAllWindows()

Bu yazının tamamını okuyup, anlayıp, uyguladıysanız yavaş yavaş OpenCV’yle ve görüntü işlemeyle tanışmaya başlıyorsunuz demektir. Programlamaya yeni başlayan biri nasıl, “merhaba dünya” çıktısı alıyorsa, resim göstermek de OpenCV’nin merhaba dünyasıdır.

Yorum yapılmamış

Yorumunuzu ekleyin