Bilgisayarlı Görü

Dr. Öğr. Üyesi Oğuz Emre Kural

2026

Gündem

  • Tanışma ve Derse Giriş
    • Dersin hedefleri, yapısı ve değerlendirme kriterleri
  • Bilgisayarlı Görü Nedir?
    • Tanım, motivasyon ve tarihsel perspektif
  • Temel Kavramlar: Dijital Görüntü
    • Piksel, çözünürlük ve koordinat sistemleri
    • Görüntü türleri: Gri seviye, RGB ve diğer renk uzayları
  • Görüntülerin Matematiksel Temsili
    • Görüntüler birer matristir
    • Temel piksel operasyonları
  • Uygulama: Python ve OpenCV ile İlk Adımlar
    • Görüntü okuma, yazma ve temel manipülasyonlar
  • Tartışma ve Gelecek Hafta

Bölüm 1: Giriş ve Motivasyon

Dersin Kapsamı ve Hedefleri

🎓 Advanced Computer Vision

Bu ders, bilgisayarlı görünün temel prensiplerinden başlayarak, modern derin öğrenme tabanlı yöntemlere ve güncel araştırma konularına uzanan kapsamlı bir yolculuk sunmayı amaçlamaktadır.

Kazanımlar:

  • Görüntü işleme ve geometrik görünün temel algoritmalarını anlamak ve uygulamak.
  • Derin öğrenme tabanlı görü modellerini (CNN, Transformer) tasarlamak ve eğitmek.
  • Nesne tespiti, bölütleme gibi temel görü görevlerini çözebilmek.
  • Güncel araştırma literatürünü takip edebilme ve eleştirel bir bakış açısı kazanma.
  • Dönem sonunda, özgün bir problemi bilgisayarlı görü yöntemleriyle çözebilen bir proje geliştirmek.

Bilgisayarlı Görü Nedir?

Tanım: Bilgisayarlı görü (Computer Vision), makinelere insan benzeri bir “görme” ve “anlama” yeteneği kazandırmayı hedefleyen bir bilim ve teknoloji alanıdır.

“How can we get computers to see and understand the visual world?”

Temel Amaç: Dijital görüntülerden veya videolardan anlamlı bilgiler çıkarmak.

Bu sadece görüntüleri “okumak” değil, aynı zamanda yorumlamak, analiz etmek ve karar vermek anlamına gelir.

Neden Bilgisayarlı Görü? | Uygulama Alanları

Bilgisayarlı görü, modern teknolojinin temel taşlarından biridir.

Alan Uygulama Örnekleri
Otonom Sistemler Sürücüsüz arabalar, dronlar, robotik
Tıp ve Sağlık Medikal görüntü analizi (MR, CT), kanser tespiti
Güvenlik Yüz tanıma, nesne takibi, anomali tespiti
Artırılmış Gerçeklik Sanal nesneleri gerçek dünyaya yerleştirme (AR)
Perakende Otomatik kasalar, envanter yönetimi
Tarım Ürün rekoltesi tahmini, hastalık tespiti

Tarihsel Perspektif: Kısa Bir Bakış

  • 1960s: “The Summer Vision Project” (MIT) - Alanın başlangıcı. Basit blok dünyalarını anlama hedefi.
  • 1970s-80s: David Marr’ın çalışmaları. Kenarlar, dokular gibi alt seviye özelliklerden 3B modellere geçiş paradigması.
  • 1990s-2000s: İstatistiksel ve makine öğrenmesi yaklaşımları. SIFT, HOG gibi özellik çıkarıcıların ve SVM gibi sınıflandırıcıların yükselişi.
  • 2012 ve Sonrası: Derin Öğrenme Devrimi
    • AlexNet’in ImageNet yarışmasını kazanması, Konvolüsyonel Sinir Ağları’nın (CNN) baskın paradigma haline gelmesini sağladı.
    • Bu dersin ikinci yarısında bu devrimi detaylıca inceleyeceğiz (Hafta 7 ve sonrası).

Bölüm 2: Temel Kavramlar

Dijital Görüntü Nedir?

Matematiksel olarak, bir 2D dijital görüntü, \(f(x, y)\) fonksiyonu olarak modellenebilir.

Burada \((x, y)\) düzlemdeki konumu (koordinat), \(f\)’in o noktadaki değeri ise yoğunluk veya parlaklık seviyesini (intensity) temsil eder.

  • Bu fonksiyon, hem uzamsal koordinatlar \((x, y)\) hem de yoğunluk değeri bakımından ayrık (discrete) bir yapıdadır.
  • Bu ayrık yoğunluk değerlerinin her birine Piksel (Picture Element) denir.

Piksel ve Görüntü Koordinatları

Piksel: Bir dijital görüntünün en küçük temel yapı taşıdır. Genellikle tek bir sayısal değer (gri seviye) veya bir dizi değer (renkli) ile temsil edilir.

Koordinat Sistemi:

  • Genellikle görüntü işlemede, koordinat sisteminin orijini \((0, 0)\) sol üst köşededir.
  • x ekseni sağa doğru (sütunlar - columns), y ekseni ise aşağıya doğru (satırlar - rows) artar.
  • Bu, geleneksel Kartezyen koordinat sisteminden farklıdır! Kod yazarken img[row, col] veya img[y, x] kullanımına dikkat etmek kritiktir.

Görsel: Bir grid üzerinde sol üst köşesi (0,0) olarak işaretlenmiş ve x, y eksenleri gösterilmiş piksel matrisi.

Görüntü Türleri: Gri Seviye (Grayscale)

En basit görüntü türüdür. Her piksel tek bir sayı ile temsil edilir.

Bit Derinliği (Bit Depth): Bir pikselin alabileceği yoğunluk seviyelerinin sayısını belirler. - 8-bit Gri Seviye Görüntü: En yaygın olanıdır. - Her piksel \(2^8 = 256\) farklı değer alabilir. - Değer aralığı: [0, 255] - 0: Saf Siyah - 255: Saf Beyaz - Aradaki değerler: Gri tonları

Görsel: Siyah-beyaz bir fotoğraf ve yanında piksellerin sayısal değerlerini gösteren bir matris kesiti.

Görüntü Türleri: Renkli (RGB)

İnsan gözünün renk algısına en yakın model olan RGB (Red, Green, Blue) modelini kullanır.

  • Her piksel, 3 farklı yoğunluk değerinin bir kombinasyonudur.
  • Bu kanalların her biri genellikle 8-bit’tir.
  • Kanal Sayısı: 3 (R, G, B)
  • Piksel Değeri: (R, G, B) şeklinde bir demet (tuple).
    • (0, 0, 0): Siyah
    • (255, 255, 255): Beyaz
    • (255, 0, 0): Kırmızı

Görsel: Renkli bir fotoğrafın Kırmızı, Yeşil ve Mavi kanallarına ayrılmış hali. Her kanal bir gri seviye görüntü gibi görünür.

Görüntü Çözünürlüğü ve Boyut

Çözünürlük (Resolution): Bir görüntüdeki piksel sayısını ifade eder ve genellikle Genişlik × Yükseklik olarak belirtilir. - Örnek: 1920 × 1080 (Full HD)

Bellekteki Boyut: Bir görüntünün bellekte ne kadar yer kapladığını hesaplayabiliriz.

Boyut (byte) = Genişlik × Yükseklik × Kanal Sayısı × (Bit Derinliği / 8)

Örnek: 8-bit, 512 × 512 piksel bir RGB görüntü: 512 × 512 × 3 × (8 / 8) = 786,432 byte ≈ 768 KB

Bu hesaplama, sıkıştırma uygulanmamış ham (raw) veri için geçerlidir. (JPEG, PNG gibi formatlar sıkıştırma kullanır.)

Bölüm 3: Görüntülerin Matematiksel Temsili

Görüntü = Matris

Bilgisayarlı görüdeki temel paradigma: Görüntüler birer matristir.

  • Gri Seviye Görüntü: 2-boyutlu bir matris (veya NumPy array).
    • Boyut: (Yükseklik, Genişlik)
  • Renkli (RGB) Görüntü: 3-boyutlu bir matris.
    • Boyut: (Yükseklik, Genişlik, 3)

Bu temsil, lineer cebir ve matris operasyonlarını kullanarak görüntüler üzerinde güçlü manipülasyonlar yapmamızı sağlar.

Temel Piksel Operasyonları: Parlaklık ve Kontrast

Bu operasyonlar her bir piksele bağımsız olarak uygulanır (Point Operations).

Parlaklık (Brightness) Ayarı: Görüntüye sabit bir değer eklemek/çıkarmak. \(I_{out}(x, y) = I_{in}(x, y) + \beta\)

  • \(\beta > 0\): Görüntü aydınlanır.
  • \(\beta < 0\): Görüntü kararır.

Kontrast (Contrast) Ayarı: Görüntüyü sabit bir değerle çarpmak/bölmek. \(I_{out}(x, y) = I_{in}(x, y) * \alpha\)

  • \(\alpha > 1\): Kontrast artar.
  • \(0 < \alpha < 1\): Kontrast azalır.

Not: Bu işlemler sonucunda değerler [0, 255] aralığının dışına çıkabilir. Bu duruma doyma (saturation) denir ve değerler bu aralığa kırpılmalıdır (clipping).

Görüntü Histogramı

Histogram: Bir görüntüdeki piksel yoğunluk değerlerinin dağılımını gösteren bir grafiktir. - x-ekseni: Piksel değerleri (örn: 0-255) - y-ekseni: O değere sahip piksel sayısı (frekans)

Ne işe yarar?

  • Görüntünün genel parlaklığı ve kontrastı hakkında hızlı bir fikir verir.
  • Karanlık Görüntü: Histogram grafiği sol tarafa (düşük değerlere) yığılır.
  • Aydınlık Görüntü: Histogram grafiği sağ tarafa (yüksek değerlere) yığılır.
  • Düşük Kontrastlı Görüntü: Histogram dar bir aralıkta toplanır.
  • Görüntü iyileştirme, eşikleme (thresholding) gibi birçok ileri seviye tekniğin temelini oluşturur.

Görsel: Yan yana bir karanlık, bir aydınlık ve bir düşük kontrastlı görüntü ile altlarında ilgili histogram grafikleri.

Bölüm 4: Uygulama: Python ve OpenCV

Kütüphanelerin Kurulumu ve İçe Aktarılması

Bu derste ağırlıklı olarak OpenCV ve NumPy kütüphanelerini kullanacağız. Görselleştirme için ise Matplotlib.

# Terminal veya komut istemine yazarak kurabilirsiniz
pip install opencv-python numpy matplotlib
# Python script'lerimizin başlangıcı
import cv2
import numpy as np
import matplotlib.pyplot as plt

print(f"OpenCV Versiyonu: {cv2.__version__}")

Görüntü Okuma ve Gösterme

OpenCV, görüntüleri diskten okumak için imread fonksiyonunu kullanır.

# Görüntüyü renkli olarak oku (varsayılan mod)
img_color = cv2.imread('assets/sample.jpg', cv2.IMREAD_COLOR)

# Görüntüyü gri seviye olarak oku
img_gray = cv2.imread('assets/sample.jpg', cv2.IMREAD_GRAYSCALE)

# Görüntü başarıyla okundu mu kontrol et
if img_color is None:
    print("Hata: Görüntü yüklenemedi!")
else:
    print("Görüntü başarıyla yüklendi.")

Önemli Not: OpenCV görüntüleri varsayılan olarak BGR (Blue, Green, Red) formatında okur, RGB değil! Bu, Matplotlib gibi diğer kütüphanelerle çalışırken renklerin yanlış görünmesine neden olabilir.

Görüntü Özelliklerine Erişme

Okunan görüntü bir NumPy array’idir. Bu sayede özelliklerine kolayca erişebiliriz.

# Görüntünün boyutlarını (yükseklik, genişlik, kanal) al
# Not: Gri seviye görüntülerde kanal sayısı olmaz.
height, width, channels = img_color.shape
print(f"Boyutlar: {height}x{width}, Kanal Sayısı: {channels}")

# Toplam piksel sayısı
print(f"Toplam Piksel: {img_color.size}")

# Veri tipi (genellikle uint8 - 8-bit unsigned integer)
print(f"Veri Tipi: {img_color.dtype}")
# TODO: Aynı işlemleri img_gray için yapın ve shape çıktısını gözlemleyin.
# h_gray, w_gray = img_gray.shape
# print(f"Gri Seviye Boyutlar: {h_gray}x{w_gray}")

Piksel Değerlerine Erişim ve ROI

Tek bir pikselin değerini veya belirli bir bölgeyi (Region of Interest - ROI) alabiliriz.

# (y, x) koordinatındaki pikselin BGR değerini al
# Koordinatların (satır, sütun) sırasında olduğuna dikkat edin!
px_val = img_color
print(f"Piksel (100, 50) değeri: {px_val}")

# Sadece Mavi (Blue) kanalının değerini al
blue_val = img_color # B=0, G=1, R=2
print(f"Piksel (100, 50) Mavi değeri: {blue_val}")

# Bir bölgeyi (ROI) kesip al
# Y-ekseninde 100'den 200'e, X-ekseninde 200'den 300'e kadar olan bölge
roi = img_color[100:200, 200:300]

# TODO: ROI'nin bir köşesindeki pikseli siyaha (0,0,0) ayarlayın ve sonucu gözlemleyin.
# img_color =```

---

## Renk Uzayı Dönüşümü: BGR -> RGB

Matplotlib ile doğru renklerde görüntüleme yapmak için BGR'den RGB'ye dönüşüm şarttır.

```python
# OpenCV'nin BGR formatını Matplotlib'in beklediği RGB formatına çevir
img_rgb = cv2.cvtColor(img_color, cv2.COLOR_BGR2RGB)

# Görüntüleri görselleştirelim
plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)
plt.imshow(img_color) # Renkler yanlış görünecek (BGR)
plt.title('OpenCV (BGR) ile Gösterim')
plt.axis('off')

plt.subplot(1, 2, 2)
plt.imshow(img_rgb) # Renkler doğru görünecek (RGB)
plt.title('Matplotlib (RGB) ile Gösterim')
plt.axis('off')

plt.show()

Görsel: Yan yana, renkleri bariz şekilde farklı olan (mavi ve kırmızı tonlarının yer değiştirdiği) iki aynı resim.

Uygulama: Histogram Hesaplama

OpenCV veya Matplotlib kullanarak bir görüntünün histogramını hesaplayabiliriz.

# Gri seviye görüntünün histogramını hesaplayalım
# Matplotlib'in hist fonksiyonu daha pratiktir.
# .flatten() metodu 2D matrisi 1D bir diziye çevirir.
plt.figure(figsize=(8, 6))
plt.hist(img_gray.flatten(), 256,, color='gray')
plt.title('Gri Seviye Görüntü Histogramı')
plt.xlabel('Piksel Yoğunluğu')
plt.ylabel('Piksel Sayısı')
plt.xlim()
plt.grid(True)
plt.show()

# TODO: Renkli görüntünün her bir kanalı için ayrı ayrı histogram çizin.
# colors = ('b', 'g', 'r')
# for i, col in enumerate(colors):
#     hist = cv2.calcHist([img_color], [i], None,,)
#     plt.plot(hist, color = col)
# plt.show()

Görsel: Bir gri seviye fotoğraf ve yanında ona ait histogram grafiği.

Bölüm 5: Tartışma ve Sonuç

Mini Quiz

  1. Soru: 8-bit, 1024x768 çözünürlüğünde bir gri seviye görüntünün sıkıştırılmamış boyutu bellekte yaklaşık ne kadardır?
    • Cevap: 1024 768 * 1 * (8/8) = 786,432 byte = 768 KB*
  2. Soru: cv2.imread() ile okunan bir renkli görüntüde, img[0, 0] pikselinin ilk elemanı (img[0, 0, 0]) hangi renk kanalını temsil eder?
    • Cevap: Mavi (Blue)
  3. Soru: Bir görüntünün histogramı grafiğin orta bölgelerinde dar bir alana sıkışmışsa, bu görüntü hakkında ne yorum yapılabilir?
    • Cevap: Görüntünün kontrastı düşüktür.

Mini Proje / Ödev Fikri (Hafta 2’ye kadar)

Görev: Temel Görüntü Manipülatörü

  1. Seçtiğiniz bir renkli görüntüyü Python ve OpenCV kullanarak okuyun.
  2. Görüntüyü B, G, R kanallarına ayırın (cv2.split). Her bir kanalı ayrı bir pencerede gri seviye görüntü olarak gösterin.
  3. Kullanıcıdan bir parlaklık (beta) ve bir kontrast (alfa) değeri alan bir fonksiyon yazın.
  4. Bu fonksiyon, girdi olarak aldığı görüntüyü \(g(x,y) = \alpha \cdot f(x,y) + \beta\) formülünü kullanarak değiştirsin.
    • İpucu: np.clip fonksiyonu ile sonuçları [0, 255] aralığında tutmayı unutmayın.
  5. Orijinal ve işlenmiş görüntüyü yan yana göstererek sonuçları karşılaştırın. Farklı alfa ve beta değerleriyle denemeler yapın.

Reflection Question (Üzerine Düşünme Sorusu)

Dijital bir görüntü, temsil ettiği gerçek dünya sahnesinin “mükemmel” bir kopyası mıdır? Sensörler, lensler ve sayısallaştırma süreci, gerçek dünyadaki hangi bilgilerin kaybolmasına veya değişmesine neden olur?

Bu Hafta Ne Öğrendik & Gelecek Hafta

Özet:

  • Bilgisayarlı görünün ne olduğunu, önemini ve temel uygulama alanlarını kavradık.
  • Dijital görüntülerin piksel, çözünürlük, renk uzayı gibi temel yapı taşlarını öğrendik.
  • Görüntülerin aslında birer matris olduğunu ve bu sayede üzerlerinde matematiksel işlemler yapabileceğimizi gördük.
  • Python, OpenCV ve NumPy ile görüntüleri nasıl okuyacağımızı, temel özelliklerine nasıl erişeceğimizi ve basit manipülasyonları nasıl yapacağımızı uygulamalı olarak deneyimledik.

Gelecek Hafta (Hafta 2): Görüntü Filtreleme ve Konvolüsyon > Bu hafta piksellere tek tek odaklandık. Gelecek hafta, bir pikselin komşularıyla olan ilişkisini kullanarak daha anlamlı işlemler yapacağız. Gürültü azaltma, kenar bulma gibi temel ve güçlü tekniklerin kapısını aralayacağız. Bu, Konvolüsyonel Sinir Ağları’nın (CNN) temelini oluşturan konvolüsyon operasyonunu anlamak için ilk ve en önemli adım olacak.

İleri Okuma ve Referanslar