5.5. Bölgeler ve maskeler

image modülündeki her işlem, varsayılan olarak kaynak görüntüsünün her pikseline dokunur. Bu, açıklanması en basit davranıştır ve algoritmanın işi gerçekten tüm çerçeveyi kapsadığında doğru olanıdır – tek tip bir renk düzeltmesi, küresel bir histogram, iletim için bir kodlama geçişi. Ancak pratikte çoğu algoritma bundan daha azına bakmak ister. Renkli bir işaretçiyi izleyen bir nokta (blob) takipçisi, arkasındaki duvarla değil, işaretçinin görünebileceği sahne kısmıyla ilgilenir. Morfolojik bir temizleme geçişi, yalnızca daha önceki bir aşamanın aday olarak işaretlediği piksellerin üzerinde güvenlidir. Bir yüz tespit edici, yalnızca daha kaba bir tespit edicinin önceden daralttığı sınırlayıcı kutunun içinde çalışabilir. image modülü, bir işlemi piksellerin bir alt kümesine kapsamlandıran iki mekanizma aracılığıyla bu çalışmayı destekler: dikdörtgen ilgi bölgeleri ve ikili maskeler. Bunlar serbestçe birleştirilebilir ve piksellere dokunan neredeyse her yöntem, bunlardan birini – ya da her ikisini – bir anahtar sözcük argümanı olarak kabul eder.

5.5.1. İlgi bölgeleri

İlgi bölgesi, koordinatlar sayfasında tanıtılan (x, y, w, h) dörtlüsüyle adlandırılan bir piksel dikdörtgenidir. Arayüzdeki yaklaşık otuz yöntem bir roi anahtar sözcük argümanı kabul eder; mevcut olduğunda, işlem yalnızca o dikdörtgenin içindeki piksellerde çalışır ve görüntünün geri kalanına dokunmadan bırakır. roi None olduğunda veya atlandığında, işlem tüm görüntü üzerinde çalışır – tıpkı roi=(0, 0, width, height) geçirilmiş gibi.

Kodda, anahtar sözcük işlemin aldığı diğer argümanların yanında yer alır:

# Compute a histogram over a centred crop of the image.
h = img.get_histogram(roi=(64, 64, 128, 128))

ROI’lerin sağladığı ilk şey yanlış pozitif kontrolüdür. Yalnızca masaya bakan bir renk takipçisi, yanından geçen gömleğe asla tetiklenmez; yalnızca tanımlı çalışma alanının içinde çalışan bir kenar tespit edici, kamera montajının kendi kenarlarını asla bildirmez. Arama alanını sahnenin algoritmanın gerçekten önemsediği kısmına indirmek, bir işlem hattının kendi güvenilirliğine yapabileceği en ucuz iyileştirmedir.

Sağladıkları ikinci şey kabadan-inceye işlem hattıdır. Tespit sonucu nesneleri – bir blob, bir rect, bir apriltag vb. – sınırlayıcı kutularını, roi kabul eden aynı (x, y, w, h) dörtlüsü olarak sunar. Böylece kaba bir ilk aşama bir sınırlayıcı kutu döndürebilir, kutu doğrudan bir sonraki aşamanın roi argümanına düşer ve ikinci aşama daha dar alan üzerinde çalışır. Her aşamalı daraltma hem bir sonraki aşamayı hızlandırır hem de sonuçlarını daha güvenilir kılar, çünkü arama uzayı zaten filtrelenmiştir.

5.5.2. İkili maskeler

İlgi alanı eksenlere hizalı olduğunda dikdörtgen doğru biçimdir. Olmadığında – eğri bir bölge, dışbükey olmayan bir bölge, daha önceki bir aşamanın “eşleşme” olarak sınıflandırdığı pikseller – işleme bunun yerine kendisini keyfi bir piksel desenine kapsamlandırması söylenmelidir. Bunun mekanizması ikili bir maskedir: kaynakla aynı boyutlarda, piksel başına açık/kapalı anahtarı olarak kullanılan ayrı bir Image. Maskedeki sıfır olmayan bir piksel “eşleşen kaynak pikselini dahil et” der; sıfır bir piksel “kaynak pikseline dokunma” der.

Bir maske genellikle bir BINARY görüntüsüdür – tam olarak bu amaç için var olan piksel başına bir bitlik biçim – ancak herhangi bir tek kanallı görüntü çalışacaktır, çünkü tüketici sıfır olmayan herhangi bir değeri açık olarak ele alır.

Filtreleme, eşikleme ve aritmetik yöntemler bir mask anahtar sözcük argümanı kabul eder. Biçim her birinde aynıdır: ayrıca tahsis edilmiş, kaynakla aynı boyutlarda ikili bir görüntü geçirilir.

ROI’ler ve maskeler birleşir. Her ikisini de geçirin, işlem yalnızca ROI’nin içinde ve maskede açık olan piksellerde çalışır. İki mekanizma, uygulama koduna bağımsız kollar sağlar – biri dikdörtgen ilgi alanı için, biri içindeki keyfi desen için – hiçbirinin diğerinden kısıtlamalar miras almasını sağlamadan.

Bir görüntüyü temsil eden küçük bir ızgara. Izgaranın üst-orta kısmı boyunca çizilmiş kesik çizgili bir dikdörtgen ROI'yi etiketler: yalnızca bu dikdörtgenin içindeki pikseller dikkate alınır. ROI'nin içinde, kabaca dairesel bir dolu hücre kümesi maskeyi etiketler: yalnızca o dolu hücreler gerçekten değiştirilir. Kalan hücreler, dokunulmadıklarını belirtmek için hafifçe gölgelendirilmiştir.

Bir ROI, bir işlemi eksenlere hizalı bir dikdörtgenle sınırlar. Bir maske, onu daha da keyfi bir piksel desenine daraltır. İkisi birleşir: yalnızca ROI’nin içinde ve maskede açık olan pikseller değiştirilir.

5.5.3. Maske oluşturma

Üç Image yöntemi, seçilen bölgenin dışındaki pikselleri sıfırlayarak yaygın maske geometrilerini yerinde oluşturur:

Her biri (x, y, w, h) (dikdörtgen ve elips için) veya (x, y, radius) (daire için) alır. Bunlardan herhangi birini argümansız çağırmak geometriyi ortalar ve görüntüyü dolduracak şekilde boyutlandırır; bu, amacın yalnızca köşeleri gizleyen basit bir tam görüntü oval veya dairesi olduğunda bir uygulamanın başvurduğu biçimdir.

mask = image.Image(img.width(), img.height(), image.BINARY)
mask.clear()              # start from all zeros
mask.mask_ellipse()       # centred, full-size oval

İlginç maskeler nadiren yalnızca mask_* yöntemlerinden gelir. Bunlar işlem hattının önceki aşamalarından gelir: bir eşikleme geçişi, sıfır olmayan pikselleri eşleşmeleri işaretleyen bir ikili görüntü üretir; bu, bir sonraki aşamanın mask= argümanına beslenmesi için tam olarak doğru biçimdir. Morfolojik bir temizleme geçişi, biçimini değiştirmeden o maskeyi inceltir. Tek kanallı bir görüntü olarak sonuçlanan her şey kendisi geçerli bir maskedir.

5.5.4. İşlemlerin görüntüyü nasıl değiştirdiği

Son birkaç sayfadaki her kod parçacığında görünen bir desen – işlemin zincirleme için aynı img görüntüsünü döndürmesi – her yeni yöntem tanıtıldığında yeniden belirtilmek zorunda kalmaması için açıkça vurgulanmaya değer. Image arayüzünde üç yöntem ailesi görünür ve her biri kaynak görüntüyü farklı şekilde ele alır:

  • İşletim yöntemleri kaynağın piksellerini yerinde değiştirir ve zincirleme için aynı görüntüyü döndürür. Çizim, aritmetik, eşik ve filtre aileleri hepsi bu şekilde davranır. img.gaussian(1), img görüntüsünü bulanıklaştırır ve aynı img görüntüsünü döndürür; yeniden atama – img = img.gaussian(1) – zararsız ancak gereksizdir.

  • Dönüştürme yöntemleri varsayılan olarak işletim yöntemleriyle aynı şekilde yerinde çalışır, ancak kaynağın korunması gerektiğinde ayrı bir sonuç görüntüsü tahsis etmek için copy=True ve copy_to_fb=True kabul eder. Biçim dönüştürmeleri ve geometrik kopyalar bu ailenin başlıca üyeleridir.

  • İnceleme yöntemleri pikselleri okur ve kaynak görüntüyü hiç değiştirmeden bir sonuç nesnesi döndürür – tespit edilen özniteliklerin bir listesi, bir histogram, bir istatistik kümesi.

Bu üçlü ayrım tüm arayüz boyunca tutarlıdır. Bir yöntemin hangi aileye ait olduğunu bilmek, uygulamaya bir çağrıdan ne beklemesi gerektiğini söyler: kaynağın piksellerinin sağlam kalıp kalmayacağı, ayrı bir sonuç görüntüsünün tahsis edilip edilmeyeceği ve dönüş değerinin kaynağın kendisi mi yoksa başka bir şey mi olduğu.