Bilgisayarlı Görü

Bilgisayarlı Görüye Giriş - Görüntünün Temelleri

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

2026

Giriş

Öğrenme Kazanımları

Bu dersin sonunda:

  • Örnekleme ile kuantalamayı ayırt edebileceksiniz.
  • Bir görüntünün boyutunu, renk kanallarını ve veri tipini yorumlayabileceksiniz.
  • Piksele ve bir görüntü bölgesine doğru indekslemeyle erişebileceksiniz.
  • Yeniden boyutlandırmanın görüntü üzerindeki etkisini açıklayabileceksiniz.
  • Histogramı yorumlayıp hangi bilgileri göstermediğini belirtebileceksiniz.

Classroom

  • Sınıf Kodu: 4xdu3hzx
  • classroom.google.com → Sınıfa katıl → kodu girin (kurumsal hesapla).

Dijital Görüntünün Anatomisi

Görüntünün Sayısallaştırılması: Örnekleme ve Kuantalama

Gerçek dünya analog bir sinyaldir. Dijital görüntü elde etmek iki temel adımdan geçer:

  1. Örnekleme (Sampling): Uzamsal olarak sürekli olan görüntüden ayrık konumlarda değer alma işlemidir. Aynı görüntü alanında daha sık örnekleme, daha fazla piksel üretir.

  2. Kuantalama (Quantization): Her örneğin yoğunluk değerini sonlu sayıdaki seviyelerden birine atama işlemidir. Kullanılan bit derinliği, kaç farklı seviyenin temsil edilebileceğini belirler.

Daha Fazla Piksel, Daha Fazla Ayrıntı mı?

  • Piksel boyutları: Görüntünün kaç satır ve sütundan oluştuğunu belirtir (örneğin 1920 × 1080).
  • Ayrıntı çözebilme gücü: Birbirine yakın küçük yapıların ayırt edilebilmesidir; optik sistem, odaklama ve sensör gibi etkenlere de bağlıdır.

Not

Bulanık bir görüntüyü 1920 × 1080’den 3840 × 2160’a büyütmek piksel sayısını artırır; çekim sırasında kaybolan gerçek ayrıntıları geri getirmez.

Kuantalama: Kaç Gri Seviye?

Gri seviye bir görüntüde piksel başına \(b\) bit, \(L = 2^b\) farklı seviye temsil eder.

Bit derinliği Seviye sayısı Görsel etki
1-bit 2 Yalnızca siyah ve beyaz
2-bit 4 Belirgin ton basamakları
4-bit 16 Daha ince ton geçişleri
8-bit 256 Daha yumuşak ton geçişleri

Aynı Görüntü, Farklı Bit Derinlikleri

Aynı gri ton rampasının 1, 2, 4 ve 8 bit ile gösterimi. Piksel sayısı sabitken bit derinliği arttıkça ton basamakları incelir.

Tüm şeritlerde 256 örnek konumu var. Değişen, her konuma atanabilecek gri seviye sayısı.

Örnekleme: Nereden ve ne sıklıkla değer alıyoruz? Kuantalama: Bu değeri hangi seviyeye atıyoruz?

Örneklemenin Bir Yan Etkisi: Aliasing

Aliasing: Örnekleme frekansı, sinyaldeki en yüksek frekansı yakalamak için yeterli değilse (Nyquist Teoremi), yüksek frekanslı desenler daha düşük frekanslı yapılar gibi “kılık değiştirir”. Bu, görüntülerde moiré desenleri veya pürüzlü kenarlar olarak ortaya çıkar.

Uyarı

Aliasing’den Kaçınmak İçin Sezgisel Kural: Bir görüntüyü küçültmek (downsampling), örnekleme oranını düşürmek demektir. Küçültme öncesi görüntüye düşük geçiren bir filtre (örn: hafif bir bulanıklaştırma/blur) uygulamak, aliasing artefaktlarını önemli ölçüde azaltır.

Bulanıklaştırma: Yüksek frekanslı (ince çizgili) bir desenin, küçültüldüğünde oluşan rahatsız edici moiré desenleri (aliasing) ve öncesinde blur uygulanarak küçültülmüş daha temiz versiyonu.

Nyquist–Shannon Örnekleme Teoremi

Tanım (Matematiksel)

Sinyalin bant sınırlı olduğunu, yani \(f_{max}\) üzerinde frekans bileşeni içermediğini varsayalım. İdeal örnekleme ve yeniden oluşturma koşullarında, sinyalin kayıpsız yeniden oluşturulabilmesi için yeterli koşul:

\[ f_s > 2 \, f_{max} \]

Burada:

\(f_s\) örnekleme frekansı (örnek sayısı/saniye)

\(f_{max}\) sinyaldeki en yüksek frekans bileşeni

Başka bir deyişle: En yüksek frekanslı bileşenin her periyodunda ikiden fazla örnek almalısın. Bu koşul, kuantalama veya ölçüm gürültüsünden doğan kayıpları ortadan kaldırmaz.

Örnek (Ses)

Bant sınırlı bir ses sinyalinin en yüksek frekansı 10 kHz ise:

\[ f_{max} = 10{,}000 \text{ Hz} \]

Nyquist’e göre:

\[ f_s > 2 \times 10{,}000 = 20{,}000 \text{ Hz} \]

CD kalitesinde ses 44.1 kHz ile örneklenir,
çünkü insan kulağı yaklaşık 20 kHz’e kadar duyabilir.

Görüntüde Nyquist

Görüntülerde frekans, pikseller arasındaki değişim hızını temsil eder.

  • İnce desenli bir kumaş, tuğla duvarı veya saç teli gibi yüksek frekanslı bölgeler yeterince sık örneklenmezse → moiré desenleri veya titreşimli paternler oluşur.

Not

Çözüm: Küçültme (downsampling) işlemi öncesinde düşük geçiren bir filtre (blur) uygulayarak yüksek frekansları bastırmak, aliasing etkisini önemli ölçüde azaltır.

Nyquist’in Üç Durumu

Durum Örnekleme Oranı Görsel / Sonuç
\(f_s < 2f_{max}\) Yetersiz örnekleme Aliasing riski; kayıpsız yeniden oluşturma garantisi yok
\(f_s = 2f_{max}\) Nyquist sınırı Sınır frekansındaki bileşen örnekleme fazına bağlı olarak kaybolabilir
\(f_s > 2f_{max}\) Yeterli örnekleme Bant sınırlı sinyal, ideal koşullarda yeniden oluşturulabilir

Not

Tam sınırda, sinüs dalgasının yalnızca sıfır geçişlerini örnekleyebiliriz: dalga var olduğu hâlde tüm örnekler sıfır olur. Yeterli örnekleme oranının üzerine çıkmak daha fazla veri üretir; tek başına daha doğru bir ölçüm garantilemez.

Görsel Özet

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:

  • Orijin \((0, 0)\) sol üst köşededir.
  • x ekseni sağa doğru (sütunlar), y ekseni ise aşağıya doğru (satırlar) artar.
  • Kod yazarken img[row, col] veya img[y, x] kullanımına dikkat etmek kritiktir.

Koordinat Sistemi

Somut Örnek (3x4 Gri Seviye Görüntü)

\[ img = \begin{pmatrix} 10 & 11 & 12 & 13 \\ 20 & 21 & 22 & 23 \\ 30 & 31 & 32 & 33 \end{pmatrix} \]

Amaç: \((x=1,\,y=2)\) pikselini okumak

  • Doğru: img[y, x] = img[2, 1] = 31
  • Yanlış: img[x, y] = img[1, 2] = 22

Görüntü Türleri: Gri Seviye ve RGB

  • Gri Seviye (Grayscale): Her piksel tek bir sayı ile temsil edilir.
    • 8-bit: Her piksel [0, 255] aralığında bir değer alır (0=Siyah, 255=Beyaz).
    • Matris Boyutu: (Yükseklik, Genişlik)
  • Renkli (RGB): Her piksel 3 kanallı bir değerle temsil edilir.
    • Her kanal genellikle 8-bit’tir.
    • Piksel Değeri: (R, G, B) şeklinde bir demet.
    • Matris Boyutu: (Yükseklik, Genişlik, 3)
    • Bu durum toplamda 24-bit renk derinliği elde edilir.

Önemli

OpenCV, görüntüleri varsayılan olarak BGR (Blue, Green, Red) formatında okur!

RGB’den Gri Seviyeye

Gri seviyeye dönüşüm, genellikle üç kanalın basit aritmetik ortalaması değildir. OpenCV’nin RGB/BGR → gri seviye dönüşümünde kanallar farklı ağırlıklarla birleştirilir:

\[ Y = 0.299R + 0.587G + 0.114B \]

  • Yeşil kanalın katkısı en yüksek, mavi kanalın katkısı en düşüktür.
  • Örneğin saf kırmızı \((255, 0, 0)\) yaklaşık 76, saf yeşil \((0, 255, 0)\) yaklaşık 150 gri seviye değerine dönüşür.

Önemli

Üç kanal tek bir değere indirgenirken renk bilgisi kaybolur. Farklı renkler aynı gri seviyeye dönüşebilir; gri görüntüden özgün renkler geri elde edilemez.

Görüntülerin Matematiksel Temsili

Veri Tipleri, Kırpma ve Normalizasyon

Görüntüler matrislerdir, ancak bu matrislerin elemanlarının veri tipi (dtype) önemlidir.

  • uint8 (Unsigned 8-bit Integer): En yaygın format. [0, 255] aralığındaki tam sayıları saklar. Bellek verimlidir.
  • float32 (32-bit Floating Point): Genellikle [0.0, 1.0] aralığına normalize edilmiş değerler için kullanılır. Derin öğrenme modelleri ve bazı hassas hesaplamalar için gereklidir.

Kırpma (Clipping): uint8 bir görüntüye yapılan işlemler (örn: parlaklık artırma) sonucu değerler [0, 255] aralığının dışına çıkabilir. Bu değerlerin bu aralığa zorlanmasına “clipping” denir. np.clip() bu iş için idealdir.

Not

Gamma Düzeltmesi (Gamma Correction): İnsan gözü parlaklığı lineer olarak algılamaz. Monitörler bunu telafi etmek için görüntüleri “gamma-kodlu” olarak saklar. İşlemlerin fiziksel olarak doğru olması için bazen bu gamma’yı tersine çevirip “lineer” uzayda çalışmak gerekebilir.

Temel Piksel Operasyonları: Parlaklık ve Kontrast

Her bir piksele bağımsız olarak uygulanırlar.

Formülasyon: \(I_{out}(x, y) = \text{clip}(\alpha \cdot I_{in}(x, y) + \beta, 0, 255)\)

  • \(\alpha\): Kontrast kontrolü (\(\alpha > 1\) artırır, \(0 < \alpha < 1\) azaltır)
  • \(\beta\): Parlaklık kontrolü (\(\beta > 0\) aydınlatır, \(\beta < 0\) karartır)

Bu işlemler, görüntü histogramını sağa/sola kaydırır (\(\beta\)) veya genişletir/daraltır (\(\alpha\)).

Temel Geometrik Operasyonlar

Görüntüleri yeniden boyutlandırma, döndürme gibi işlemler piksellerin yerini değiştirir. Bu sırada yeni piksel değerlerinin hesaplanması gerekir.

Kavram İlke / Not OpenCV Fonksiyonları
İnterpolasyon Piksel değerlerini tahmin etme yöntemi. NEAREST (hızlı, pürüzlü), LINEAR (dengeli), CUBIC (yavaş, pürüzsüz) arasında hız-kalite dengesi vardır. cv2.resize, cv2.warpAffine
Sınır Yönetimi Görüntü kenarlarının dışındaki pikseller için varsayılan davranış. CONSTANT (sabit renk), REPLICATE (kenar pikselini tekrarla), REFLECT (yansıt) gibi modlar vardır. borderMode= argümanı

İnterpolasyon: Yeni Piksel Değerlerini Hesaplama

Bir görüntüyü yeniden boyutlandırdığımızda hedef piksel konumlarını kaynak görüntünün piksel ızgarasına eşleriz. Bu konumlar kaynak piksel merkezleriyle her zaman çakışmaz.

İnterpolasyon, hedef piksel değerlerini kaynak görüntüdeki komşu piksel değerlerinden hesaplama yöntemidir.

Seçilen algoritma; hız, kalite ve sonuçtaki pürüzsüzlük/keskinlik arasında bir denge kurar.

Büyütmede daha fazla piksel üretiriz; bu piksellerin değerlerini hangi kuralla hesaplayacağımıza karar vermemiz gerekir.

\[ \begin{pmatrix} 120 & 121 & 115 \\ 100 & 110 & 90 \\ 100 & 80 & 60 \end{pmatrix} \]

  • 3x3’lük görüntümüzü ölçekleme faktörü 3 olacak şekilde genişleterek 9x9’luk bir görüntü elde etmek istiyoruz.
  • Bir düşünce deneyi yapalım: Piksel konumlarını 3 ile çarpıp aradaki konumları boş bırakırsak ne olur? Yoğunluk değerlerini değiştirmiyoruz.

Düşünce Deneyi: 2×2 → 6×6

Gösterimi sadeleştirmek için yukarıdaki görüntünün sol üst 2×2 bölgesini kullanalım. Artık hedefimiz 9×9 değil, 6×6 boyutlu bir görüntü.

Not

Aşağıdaki konum taşıma ve sıfır doldurma adımları, yeni piksel değerlerine neden ihtiyaç duyduğumuzu göstermek içindir. cv2.resize bu boşlukları oluşturup sıfırla dolduran bir süreç uygulamaz; hedef piksel değerlerini seçilen yöntemle hesaplar.

\[ \begin{pmatrix} 120 & 121 \\ 100 & 110 \end{pmatrix} \]

\[ \begin{pmatrix} 120 & 121 \\ 100 & 110 \end{pmatrix} \]

\[ \begin{pmatrix} & & & & & \\ & & & & & \\ & & & & & \\ & & & & & \\ & & & & & \\ & & & & & \\ \end{pmatrix} \]

\[ \begin{pmatrix} 120 & 121 \\ 100 & 110 \end{pmatrix} \]

\[ \begin{pmatrix} 120 & & & & & \\ & & & & & \\ & & & & & \\ & & & & & \\ & & & & & \\ & & & & & \\ \end{pmatrix} \]

  • İlk piksel (0,0)’da. 3’le çarparsak yine (0,0)

\[ \begin{pmatrix} 120 & 121 \\ 100 & 110 \end{pmatrix} \]

\[ \begin{pmatrix} 120 & & & 121 & & \\ & & & & & \\ & & & & & \\ & & & & & \\ & & & & & \\ & & & & & \\ \end{pmatrix} \]

  • İkinci piksel (0,1)’da. 3’le çarparsak (0,3)

\[ \begin{pmatrix} 120 & 121 \\ 100 & 110 \end{pmatrix} \]

\[ \begin{pmatrix} 120 & & & 121 & & \\ & & & & & \\ & & & & & \\ 100 & & & & & \\ & & & & & \\ & & & & & \\ \end{pmatrix} \]

  • Üçüncü piksel (1,0)’da. 3’le çarparsak (3,0)

\[ \begin{pmatrix} 120 & 121 \\ 100 & 110 \end{pmatrix} \]

\[ \begin{pmatrix} 120 & & & 121 & & \\ & & & & & \\ & & & & & \\ 100 & & & 110 & & \\ & & & & & \\ & & & & & \\ \end{pmatrix} \]

  • Dördüncü piksel (1,1)’de. 3’le çarparsak (3 ,3)
  • Düşünce deneyinde boş bıraktığımız konumlara 0 atayalım: bu konumlar siyah görünecek.

\[ \begin{pmatrix} 120 & 121 \\ 100 & 110 \end{pmatrix} \]

\[ \begin{pmatrix} 120 & 0 & 0 & 121 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 100 & 0 & 0 & 110 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ \end{pmatrix} \]

  • Sıfır atamak, kaynak görüntüde bulunmayan siyah çizgiler oluşturdu.
  • İnterpolasyonda hedef piksel değerlerini kaynak komşulardan hesaplayarak bu keyfî sıfır atamasının yerine anlamlı bir kural kullanırız.

İnterpolasyon Yöntemleri

  • Hızlı ve Dengeli Seçenekler
    • INTER_NEAREST (En Yakın Komşu)
    • INTER_LINEAR (Bilinear)
  • Kalite Odaklı Seçenekler
    • INTER_CUBIC (Bicubic)
    • INTER_AREA
    • INTER_LANCZOS4

INTER_NEAREST (En Yakın Komşu)

Diyelim ki:

  • \(I_s\) : Kaynak (orijinal) görüntü
  • \(I_t\) : Hedef (yeniden boyutlandırılmış) görüntü
  • \(H_s\), \(W_s\): Kaynak görüntünün yüksekliği ve genişliği
  • \(H_t\), \(W_t\): Hedef görüntünün yüksekliği ve genişliği
  • \(I[y, x]\): Satır (\(y\)), sütun (\(x\)) sırasıyla piksel erişimi

En Yakın Komşu İnterpolasyonu

Hedef piksel \((x_t, y_t)\) için, OpenCV INTER_NEAREST yöntemindeki eşleme kuralını kullanalım:

\[ x_s = \left\lfloor \frac{x_t W_s}{W_t} \right\rfloor , \quad y_s = \left\lfloor \frac{y_t H_s}{H_t} \right\rfloor \]

Burada:

  • \(x\) sütunu, \(y\) satırı belirtir; alt indisler kaynak (\(s\)) ve hedefi (\(t\)) ayırır.
  • \(\lfloor\cdot\rfloor\) aşağı yuvarlar. Bu, seçilen eşleme kuralıdır; piksel merkezi kullanan başka kurallar farklı sonuç verebilir.
  • \(I_t[y_t, x_t] = I_s[y_s, x_s]\)

En Yakın Komşu İnterpolasyonu

Boyut: (2 x 2)
Ölçekleme faktörü: (3)
Yeni boyut: (6 x 6)

Her hedef piksel \((x_t, y_t)\) için kaynak koordinatlar:

\[ x_s = \left\lfloor \frac{x_t \cdot 2}{6} \right\rfloor = \left\lfloor \frac{x_t}{3} \right\rfloor \\ y_s = \left\lfloor \frac{y_t \cdot 2}{6} \right\rfloor = \left\lfloor \frac{y_t}{3} \right\rfloor \]

En Yakın Komşu İnterpolasyonu

Hedef Satır (\(y_t\)) Kaynak Satır (\(y_s\))
0, 1, 2 0
3, 4, 5 1
Hedef Sütun (\(x_t\)) Kaynak Sütun (\(x_s\))
0, 1, 2 0
3, 4, 5 1

En Yakın Komşu İnterpolasyonu

Her bölge için kaynak indeksler \([y_s, x_s]\) (satır, sütun) sırasındadır:

  • ((0 <= y_t < 3, 0 <= x_t < 3)) → kaynak [0, 0] → 120
  • ((0 <= y_t < 3, 3 <= x_t < 6)) → kaynak [0, 1] → 121
  • ((3 <= y_t < 6, 0 <= x_t < 3)) → kaynak [1, 0] → 100
  • ((3 <= y_t < 6, 3 <= x_t < 6)) → kaynak [1, 1] → 110

En Yakın Komşu İnterpolasyonu

\[ \begin{pmatrix} 120 & 121 \\ 100 & 110 \end{pmatrix} \]

\[ \begin{pmatrix} 120 & 120 & 120 & 121 & 121 & 121 \\ 120 & 120 & 120 & 121 & 121 & 121 \\ 120 & 120 & 120 & 121 & 121 & 121 \\ 100 & 100 & 100 & 110 & 110 & 110 \\ 100 & 100 & 100 & 110 & 110 & 110 \\ 100 & 100 & 100 & 110 & 110 & 110 \end{pmatrix} \]

En Yakın Komşu İnterpolasyonu - Gözlemler

  • İlke: Yeni pikselin değerini, ona en yakın olan orijinal pikselin değeri olarak atar.
  • Sonuç: Çok hızlıdır ancak sonucu “bloklu” ve pürüzlü gösterir.
  • Kullanım: Hızın kaliteden önemli olduğu durumlar, piksel sanatı, binary görüntüler.

INTER_LINEAR (Bilinear)

  • Bilinear interpolasyon, bir noktadaki değeri, komşu 4 pikselin değerlerini ağırlıklı olarak karıştırarak tahmin eder.
  • Bu işlem hem x hem y ekseninde lineer olarak uygulanır.

Koordinat Sistemi

Yeni hedef piksel (x, y), kaynak görüntüde tam sayı olmayan bir noktaya denk gelebilir:

\[ x = i + a, \quad y = j + b \quad \text{(0 ≤ a, b < 1)} \]

Buradaki (i, j), bulunduğu hücrenin sol üst köşe koordinatıdır.

Formül

\[ I(x, y) = (1 - a)(1 - b) \cdot Q_{00} + a(1 - b) \cdot Q_{10} + (1 - a)b \cdot Q_{01} + ab \cdot Q_{11} \]

Köşeler:

\[\begin{aligned} Q_{00} &= I(i,j) && \text{(sol-üst)} \\ Q_{10} &= I(i, j+1) && \text{(sağ-üst)} \\ Q_{01} &= I(i+1, j) && \text{(sol-alt)} \\ Q_{11} &= I(i+1, j+1) && \text{(sağ-alt)} \end{aligned}\]
  • ( a ): x eksenindeki konumun hücre içindeki oranı
  • ( b ): y eksenindeki konumun hücre içindeki oranı

Bilinear İnterpolasyon - Örnek

\[ \begin{pmatrix} 120 & 121 \\ 100 & 110 \end{pmatrix} \]

Boyut: (2 x 2)
Hedef boyut: (6 x 6)
Ölçek faktörü: (3 )

Koordinat Dönüşümü

Her hedef piksel ((i, j)) için:

\[ x = \frac{i}{3}, \quad y = \frac{j}{3} \]

(x, y) koordinatı hangi kaynak hücreye düştüyse, o hücredeki 4 komşu piksel ile interpolasyon uygulanır.

Örnek Hesaplama – Piksel (1, 1)

\[ x = \frac{1}{3}, \quad y = \frac{1}{3} \Rightarrow a = 0.33, \quad b = 0.33 \]

4 komşu değer:

\[\begin{aligned} Q_{00} &= 120 \\ Q_{10} &= 100 \\ Q_{01} &= 121 \\ Q_{11} &= 110 \end{aligned}\]

Formüle göre: \[ \begin{aligned} I(0,0) &= (1 - 0.33)(1 - 0.33) \cdot 120 + 0.33(1 - 0.33) \cdot 100 \\\\ &\quad + (1 - 0.33)(0.33) \cdot 121 + 0.33 \cdot 0.33 \cdot 110 \\\\ &= 0.4489 \cdot 120 + 0.2211 \cdot 100 + 0.2211 \cdot 121 + 0.1089 \cdot 110 \\\\ &\approx 53.9 + 22.1 + 26.8 + 12.0 = \boxed{114.8} \end{aligned} \]

Diğer Örnek – Piksel (3, 3)

\[ x = \frac{3}{3} = 1, \quad y = \frac{3}{3} = 1 \Rightarrow a = 0, b = 0 \]

Doğrudan \[ Q_{22} = 110 \] ’a düşer:

\[ I(3, 3) = 110 \]

Sonuç: Yaklaşık 6x6 Matris (Doğrusal İnterpolasyon ile)

\[ \begin{pmatrix} 120 & 120.3 & 120.6 & 121 & 121 & 121 \\\\ 116.6 & 116.2 & 115.8 & 117.3 & 117.0 & 116.6 \\\\ 113.2 & 112.2 & 111.2 & 113.6 & 112.9 & 112.2 \\\\ 100 & 100.3 & 100.6 & 110 & 110 & 110 \\\\ 100 & 100.3 & 100.6 & 110 & 110 & 110 \\\\ 100 & 100.3 & 100.6 & 110 & 110 & 110 \end{pmatrix} \]

Bilinear İnterpolasyon - Gözlemler

  • INTER_LINEAR (Bilinear):
    • İlke: Yeni pikselin değerini, etrafındaki 2x2’lik komşu 4 pikselin ağırlıklı ortalaması olarak hesaplar.
    • Sonuç: Hız ve kalite arasında iyi bir denge sunar. cv2.resize fonksiyonunun varsayılan yöntemidir.
    • Kullanım: Genel amaçlı, çoğu durum için yeterli kalitede sonuçlar.

INTER_CUBIC (Bicubic)

  • İlke: Daha karmaşık bir formül kullanarak çevredeki 4x4’lük 16 komşu pikseli hesaba katar.
  • Sonuç: INTER_LINEAR’dan daha pürüzsüz ve daha kaliteli sonuçlar üretir. Biraz daha yavaştır.
  • Kullanım: Görüntü büyütme (upscaling) işlemlerinde yüksek kalite elde etmek için idealdir.

INTER_AREA

  • İlke: Piksel alanı ilişkisine göre yeniden örnekleme yapar. Görüntüyü küçültürken, hedef pikselin kapladığı alana düşen tüm kaynak piksellerin ortalamasını alır.
  • Sonuç: Görüntü küçültme (downsampling) sırasında aliasing oluşumunu engellemede en başarılı yöntemdir.
  • Kullanım: Görüntü küçültmek için kesinlikle tavsiye edilir.

INTER_LANCZOS4

  • İlke: Çevredeki 8x8’lik 64 komşu pikseli hesaba katan daha da gelişmiş bir yöntemdir.
  • Sonuç: Keskinliği korumada çok başarılıdır, genellikle en yüksek kaliteyi verir ancak en yavaş olanıdır.
  • Kullanım: Kalitenin en önemli öncelik olduğu profesyonel uygulamalar.

İnterpolasyonun Pratik Etkisi

Farklı yöntemlerin sonuçları, özellikle aşırı büyütme veya küçültme işlemlerinde belirginleşir.

Görüntü Analizi ve İyileştirme: Histogram

Histogram Nedir?

  • Histogram, bir görüntüdeki piksel değerlerinin dağılımını gösteren istatistiksel bir grafiktir.
  • Özellikle bir görüntünün genel parlaklık ve kontrast durumu hakkında hızlı ve nesnel bilgi verir.

Matematiksel Arka Plan

Gri seviye bir görüntüdeki histogram, her bir parlaklık seviyesindeki piksel sayısını sayar:

\[ h(r_k) = \text{Görüntüde } r_k \text{ değerine sahip piksel sayısı} \]

  • \(r_k\): \(k\). gri seviye (genellikle 0–255 arası)
  • \(h(r_k)\): O değerdeki piksel sayısı (frekans)

Bu değer, toplam piksel sayısına bölünerek bir olasılık dağılımı olarak da ifade edilebilir (normalize edilmiş histogram).

Histogram Grafiğinin Anatomisi

  • x-ekseni: Piksel Yoğunluğu (0 → Siyah, 255 → Beyaz)
  • y-ekseni: Frekans (O yoğunluk değerine sahip piksel sayısı)

Histogramın Analitik Gücü

Histogram, bir görüntüyü nicel olarak anlamamızı sağlar:

  • Görüntünün genel olarak aydınlık mı, karanlık mı olduğunu tespit etmek.
  • Görüntünün düşük kontrastlı mı, yoksa dengeli mi olduğunu görmek.
  • Histogram Eşitleme gibi kontrast artırıcı işlemlerin temelini oluşturmak.
  • Bir sonraki konumuz olan Eşikleme (Thresholding) ile segmentasyon işlemlerine zemin hazırlamak.

Histogram Yorumlama

Histogram Görünümü Görsel Yorumlama
Piksel dağılımı solda yoğunlaşmışsa Görüntü genel olarak karanlık tonlara sahiptir.
Piksel dağılımı sağda yoğunlaşmışsa Görüntü genel olarak çok parlak veya “yanmış”tır.
Dağılım dar bir aralıkta sıkışmışsa Görüntü düşük kontrastlıdır, “soluk” görünür.
Dağılım tüm eksene yayılmışsa Görüntü dengeli ve iyi bir kontrasta sahiptir.

Uygulama: Histogram Eşikleme

  • Eşikleme, bir görüntüyü, piksellerin parlaklık değerlerine göre iki ana gruba ayırma işlemidir.
  • Genellikle nesne ile arka planı birbirinden ayırmak (segmentasyon) için kullanılan en temel yöntemdir.

Temel Prensip

Basit bir eşik değeri \(T\) seçilir. Görüntüdeki her piksel bu değerle karşılaştırılır:

\[ I_{hedef}(x, y) = \begin{cases} 0 \text{ (siyah)}, & I_{kaynak}(x, y) < T \\ 255 \text{ (beyaz)}, & I_{kaynak}(x, y) \geq T \end{cases} \]

Bu işlemin sonucunda ikili (binary) bir görüntü elde edilir.

Eşik Değerini Histogramdan Seçmek

Histogramda birbirinden belirgin şekilde ayrılmış iki tepe (mod) varsa, bu iki grup büyük olasılıkla nesneye ve arka plana aittir.

Bu iki tepenin arasındaki vadi, eşik değeri \(T\) için ideal bir adaydır.

Her görüntü için bu eşiği elle seçmek pratik değildir. Bu nedenle otomatik bir yönteme ihtiyaç duyarız.

Otomatik Eşikleme: Otsu Metodu

  • Otsu metodu, bir görüntünün histogramını analiz ederek, en uygun eşik değerini otomatik olarak bulan bir algoritmadır.
  • Temel amacı, seçilen eşiğin ayırdığı iki piksel grubu arasındaki varyansı maksimize etmektir. Bu, grupların kendi içlerinde olabildiğince homojen olması anlamına gelir.

Otsu Algoritması: Adım 1 - Olasılık Dağılımı

Öncelikle, her bir gri seviyenin (\(k\)) görüntüde bulunma olasılığı (\(p_k\)) hesaplanır:

\[ p_k = \frac{\text{Görüntüdeki } k \text{ değerli piksel sayısı}}{\text{Toplam piksel sayısı}} \]

Bu, normalize edilmiş histogramdır.

Otsu Algoritması: Adım 2 - Sınıfların Tanımlanması

Her bir olası eşik değeri \(T\) için, pikseller iki sınıfa ayrılır:

  • Sınıf 0 (Arka Plan): \([0, 1, ..., T]\) aralığındaki pikseller.
  • Sınıf 1 (Ön Plan): \([T+1, ..., L-1]\) aralığındaki pikseller.

Bu sınıfların olasılıkları (\(\omega\)) ve ortalama parlaklık değerleri (\(\mu\)) hesaplanır.

Otsu Algoritması: Adım 3 - Sınıflar Arası Varyans

Otsu’nun maksimize etmeye çalıştığı değer, iki sınıf arasındaki varyanstır (\(\sigma_b^2\)):

\[ \sigma_b^2(T) = \omega_0(T) \cdot \omega_1(T) \cdot \left[ \mu_0(T) - \mu_1(T) \right]^2 \]

Bu değer, iki sınıfın ne kadar iyi ayrıldığının bir ölçüsüdür.

Otsu Algoritması: Adım 4 - Optimal Eşiğin Bulunması

Algoritma, tüm olası \(T\) değerleri (1’den 254’e kadar) için sınıflar arası varyansı hesaplar.

Varyansı maksimize eden \(T\) değeri, optimal eşik olarak seçilir:

\[ T_{optimal} = \arg\max_T \sigma_b^2(T) \]

Otsu Metodunun Kısıtları

  • Etkili Olduğu Durumlar: Görüntü histogramı, birbirinden net olarak ayrılabilen iki tepeye (bimodal) sahip olduğunda en iyi sonucu verir.
  • Zayıf Olduğu Durumlar: Gürültü, tekdüze aydınlatma olmaması veya histogramın tek bir tepeye sahip olması durumunda performansı düşer.

Analizden İyileştirmeye: Histogram Eşitleme

  • Histogram Eşitleme (Histogram Equalization), bir görüntünün kontrastını otomatik olarak artırmak için kullanılan güçlü bir tekniktir.
  • Amacı, piksel yoğunluklarını daha geniş bir aralığa yayarak histogramı “düzleştirmektir”.

Problem: Düşük Kontrast ve Bilgi Kaybı

  • Aşırı karanlık veya aydınlık pozlanmış görüntülerde, parlaklık seviyeleri histogramın çok dar bir aralığına sıkışabilir.
  • Bu durumda, farklı bölgeler arasındaki ince detaylar insan gözüyle seçilemez hale gelir. Histogram eşitleme bu “gizli” detayları ortaya çıkarır.

Çözüm: Kümülatif Dağılım Fonksiyonu (CDF)

Histogram eşitleme, bir görüntünün kümülatif dağılım fonksiyonunu (CDF) kullanarak her bir pikselin değerini yeniden haritalar.

Temel prensip, yoğun olan piksel aralıklarını genişletmek ve seyrek olan aralıkları daraltmaktır.

\[ I_{yeni}(x,y) = \text{round} \left( (L - 1) \cdot \text{CDF}(I_{eski}(x,y)) \right) \]

Uygulama: Python ve OpenCV

Görüntü Okuma ve Özellikler

OpenCV ile görüntü okumak ve temel özelliklerine erişmek oldukça basittir.

import cv2
import numpy as np
import matplotlib.pyplot as plt

# Görüntüyü renkli ve gri seviye olarak oku
img_color = cv2.imread('/assets/images/courses/bilgisayarli-goru/lecture1/sample.jpg', cv2.IMREAD_COLOR)
img_gray = cv2.imread('/assets/images/courses/bilgisayarli-goru/lecture1/sample.jpg', cv2.IMREAD_GRAYSCALE)

# Boyutlar (yükseklik, genişlik, kanal)
height, width, channels = img_color.shape
print(f"Renkli Görüntü: {height}x{width}, {channels} kanal, Veri Tipi: {img_color.dtype}")

# Gri seviye görüntünün kanal bilgisi yoktur
h_gray, w_gray = img_gray.shape
print(f"Gri Seviye Görüntü: {h_gray}x{w_gray}, Veri Tipi: {img_gray.dtype}")

Piksel Değerlerine Erişim ve ROI

Görüntüler NumPy dizisi olduğu için standart indeksleme kuralları geçerlidir.

# (y, x) = (satır, sütun) koordinatları
y, x = 100, 50

# Belirtilen koordinattaki pikselin BGR değerini al
px_val = img_color[y, x]
print(f"Piksel ({y}, {x}) BGR değeri: {px_val}")

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

# Bir bölgeyi (Region of Interest - ROI) kesip al
# .copy() kullanmak, ROI'deki değişikliklerin orijinal görüntüyü etkilemesini önler
roi = img_color[100:200, 200:300].copy()

# Orijinal görüntüde bir pikseli siyaha boyayalım
img_color[100, 200] = (0, 0, 0)  

BGR -> RGB Dönüşümü ve Görselleştirme

Matplotlib gibi kütüphaneler RGB formatını beklerken, OpenCV BGR kullanır. Doğru görselleştirme için dönüşüm şarttır.

# 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.imshow(img_rgb)
plt.title('Doğru Renklerle Gösterim (RGB)')
plt.axis('off')
plt.show()

Uygulama: Histogram Analizi

Histogram, bir görüntüdeki piksel yoğunluk dağılımını göstererek bize parlaklık ve kontrast hakkında hızlı bilgi verir.

# Gri seviye histogram (matplotlib ile)
plt.figure(figsize=(8,5))
plt.hist(img_gray.ravel(), bins=256, range=(0,256))
plt.title('Gri Seviye Histogram'); plt.xlabel('Yoğunluk'); plt.ylabel('Frekans')
plt.xlim(0,255); plt.grid(True); plt.show()

# R, G, B kanal histogramları (OpenCV + matplotlib)
colors = ('b','g','r')
plt.figure(figsize=(8,5)); plt.title('Kanal Bazlı Histogramlar')
for i, col in enumerate(colors):
    hist = cv2.calcHist([img_color], [i], None, [256], [0,256])
    plt.plot(hist, color=col)
plt.xlabel('Yoğunluk'); plt.ylabel('Frekans')
plt.xlim(0,256); plt.grid(True); plt.show()

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 piksel × 8-bit (1 byte) = 786,432 byte = 768 KB (≈0.75 MB).
  2. Soru: cv2.imread() ile okunan bir renkli görüntüde, img[0, 0, 0] hangi renk kanalını temsil eder?
    • Cevap: Mavi (Blue)
  3. Soru: Bir görüntüyü küçültmeden (downsampling) önce neden hafifçe bulanıklaştırmak (blur) faydalı olabilir?
    • Cevap: Aliasing artefaktlarını (istenmeyen desenleri) önlemek veya azaltmak için.