5.9. Aritmetik işlemler

Önceki bölümdeki çizim ailesi bir görüntünün içine boya yapar. Aritmetik ailesi ise iki görüntüyü bir üçüncüsünde birleştirir – piksel değerlerini toplar, birini diğerinden çıkarır, her konumda minimum veya maksimumu alır. Çerçeve farkı alma, arka plan çıkarma, pozlama istifleme ve birkaç başka klasik kalıp, bu küçük piksel-bazlı aritmetik işlem kümesinin üzerine kurulur.

Image sınıfındaki aritmetik ailesi, bir kerede sıralanabilecek kadar küçüktür:

  • add() – piksel başına self + other, biçimin maksimumuna kırpılır.

  • sub() – piksel başına self - other, alt uçta 0 değerine kırpılır.

  • rsub() – piksel başına other - self, 0 değerine kırpılır (operandları ters çevrilmiş sub ile aynı aritmetik).

  • min() – iki değerin piksel başına minimumu.

  • max() – piksel başına maksimum.

  • difference() – piksel başına |self - other|, mutlak fark.

Ayrıca iki ilgili tek-görüntü işlemi:

  • invert() – her pikseli 255 - pixel ile değiştirir (veya biçim için eşdeğer maksimum).

  • negate()invert() için bir takma ad.

Üstte, A ve B kaynak görüntülerini temsil eden iki yatay gradyan çubuğu -- A soldan sağa koyudan parlağa giderken, B soldan sağa parlaktan koyuya gider. Altlarında, A ve B'ye uygulanan her ikili işlemin sonucunu temsil eden beş gradyan çubuğu: A.add(B) her konum 255'i aşıp kırpıldığı için tek tip beyaz görünür; A.sub(B) sol yarıda sıfırdır ve sağa doğru parlaklaşır; A.difference(B) bir V şekli gösterir, her iki uçta parlak ve ortada koyu; A.min(B) uçlarda koyu ve ortada daha parlaktır; A.max(B) uçlarda parlak ve ortada gridir.

İki kaynak gradyanı A ve B ile bunlara uygulanan her ikili işlemin sonucu. Her işlem konum konum çalışır – sonuçta herhangi bir konumda görünen şey yalnızca o konumdaki iki kaynak piksele bağlıdır.

5.9.1. İki operand biçimi

İki-görüntü yöntemlerinin her biri, ikinci operandı için iki biçimden birini kabul eder:

  • Aynı boyutlarda başka bir Image. Aritmetik konum konum çalışır – (x, y) konumundaki sonuç, her iki görüntünün (x, y) konumundaki kaynak piksellerine uygulanan işlemdir.

  • Bir skaler değer – gri tonlama için bir tam sayı, RGB565 için bir (r, g, b) demeti. Aynı skaler her konumda uygulanır.

Skaler biçim, uygulama her pikseli sabit bir miktarda kaydırmak istediğinde yararlıdır. img.add(40) tüm görüntüyü 40 kadar parlaklaştırır; img.sub((20, 20, 20)) her pikseli kanal başına 20 koyulaştırır; img.max(50), 50’nin altındaki herhangi bir pikseli 50’ye yükseltir ve geri kalanını olduğu gibi bırakır – neredeyse-siyah bir sensör tabanını, sonraki aşamaların üzerinde çalışabileceği düz koyu griye dönüştüren türden bir işlem.

5.9.2. Kırpma

Piksel değerleri her işlemde biçimin aralığı içinde kalır. 8 bitlik bir kanal için bu, 0255 anlamına gelir: 255 değerini taşıyacak her şey 255 değerine geri kırpılır ve 0 değerinin altına inecek her şey 0 değerine kadar yukarı kırpılır. Etrafına sarma yoktur.

Bu seçim pratikte önemlidir. Pikselleri parlaklaştıran add, aksi takdirde matematiğin taşacağı parlak uçta asla ani bir koyulaşma kusuru üretmez; pikselleri koyulaştıran sub, aksi takdirde alttan taşacağı koyu uçta asla ani bir parlaklaşma kusuru üretmez. Sonuçlar, doygunluk uçlarında biraz bilgi kaybı pahasına görsel olarak anlamlı kalır.

Kırpma aynı zamanda sub ve rsub yöntemlerinin birbirinden farklı sonuçlar döndürmesinin nedenidir. img_a.sub(img_b), a görüntüsünün b görüntüsünden daha parlak olan kısmını verir ve diğer her yerde sıfırdır; img_a.rsub(img_b), b görüntüsünün a görüntüsünden daha parlak olan kısmını verir. Her ikisi de tek-taraflı değişim tespiti için yararlıdır – uygulama yalnızca parlaklaşan piksellerle veya yalnızca koyulaşan piksellerle ilgileniyorsa – ama hiçbiri iki çerçeve arasındaki tüm değişimi yakalamaz.

5.9.3. Fark işlemi

İki-taraflı değişim tespiti için başvurulacak işlem difference() yöntemidir; bu yöntem her konumda |self - other| değerini hesaplar – mutlak fark, işaretsiz. Her iki yönde de değişen her piksel sonuçta sıfır olmayan bir değer olarak görünür ve büyüklük o konumda ne kadar değiştiğiyle orantılıdır.

Bu özellik – tam olarak iki görüntünün uyuşmadığı yerde sıfır olmama – difference işlemini çerçeve-çerçeve değişim tespitinin beygiri yapan şeydir. Başlangıçta saklanan bir referans çerçeve ve yeni bir yakalama, difference üzerinden geçirildiğinde, sıfır olmayan pikselleri sahnedeki bir şeyin hareket ettiği veya parlaklığının değiştiği her konumu işaretleyen bir görüntü üretir.

5.9.4. Maske ile kapsamlama

Aritmetik yöntemlerinin tümü, bölgeler-ve-maskeler sayfasında tanıtılan mask anahtar kelime argümanını kabul eder. Bir maske geçirildiğinde, işlem yalnızca maskenin sıfır olmadığı konumlarda çalışır; diğer her yerde hedef görüntü olduğu gibi bırakılır.

Bu birleştirme iki kalıpta ortaya çıkar. Birincisi, bir işlemi bilinen bir alana sınırlamaktır: örneğin, iki çerçeveyi yalnızca tespit edilen bir işaretleyicinin sınırlayıcı kutusu içinde toplamak. İkincisi, bir bileşik çerçeveyi parça parça oluşturmaktır – bir ön plan maskesi içinde çerçeve dizisi üzerinde min, aynı dizi üzerinde tamamlayıcı maske içinde max – bu tür bir kalıp.

5.9.5. Yerinde ve girdileri koruyarak

Aritmetik yöntemlerin tümü daha önce belirlenen çalışma kuralına uyar: her biri kaynak görüntüyü yerinde değiştirir ve zincirleme için aynı görüntüyü döndürür. Kaynağın pikselleri çağrıdan sonra gitmiştir – ikinci operand olarak geçirilen şeye karşı yapılan işlemin sonucuyla değiştirilmiştir.

Uygulamanın her iki girdiyi de koruması gerektiğinde, güvenli kalıp önce bunlardan birini kopyalamaktır:

diff = current.copy()       # leaves current intact
diff.difference(reference)  # diff now holds the absolute difference

Bu kalıp – kopyala, sonra işlem yap – herhangi bir çerçeve-fark-alma hattının belkemiğidir; burada referans çerçevenin karşılaştırmadan sağ çıkması gerekir ki bir sonraki yakalanan çerçevede yeniden kullanılabilsin.

Altı birleştirme işlemi, iki tek-görüntü işlemi, bir mutlak-fark beygiri ve kapsamlama için mask anahtar kelimesiyle piksel-aritmetik araç takımı, klasik makine görüşünün ihtiyaç duyduğu parlaklık-ve-kanal kombinasyonlarını kapsar. Yüzeydeki geriye kalan aritmetik-benzeri araçlar, değer değer yerine bit bit çalışır.