2011-02-23 17 views
7

Bir görüntü işleme uygulamasında (eğlence için) biraz iş yapıyorum ve ColorMatrix dönüşümlerinin nasıl çalıştığını tam olarak anlamak için uğraşıyorum. Lineer/afinite dönüşümlerinin temellerini alıyorum ve örnekleri çevrimiçi olarak çoğaltarak iyice anlayabilirim, ancak niçin niçin çalıştığından emin olmak yerine bir şeyler yapabilmeyi isterim. Bunu negatif üretilmesi için bir görüntü üzerinde basit bir dönüşüm yapma ÖrneğinColorMatrix dönüşümlerinin nasıl çalıştığı hakkında açıklama

, (her bir renk, ilgili ücretsiz dönüştürülür) aşağıdaki matrisini kullanır: I -1 180degrees kosinüs olduğunu anlamak

[-1, 0, 0, 0, 0] 
[0, -1, 0, 0, 0] 
[0, 0, -1, 0, 0] 
[0, 0, 0, 1, 0] 
[1, 1, 1, 0, 1] 

Bu, tamamlayıcıya bir rengi "döndürmek" için gerekli olan dönüşdür, ama anlamadığım şey, bir renk vektörünün yukarıdaki matrisle nasıl çarpılabileceğidir ve doğru tamamlayıcı vektörü nasıl üretebileceğidir. Örneğin, bir piksel [247, 255, 0, 255, 1] ​​(RGBAW alanını kullanarak) renk vektörüne sahipse, çarpmanın yukarıdaki matrise göre gerçekleştirilmesi durumunda [-247, -255, 0, 255, 1], fakat yukarıdakilerin gerçek tamamlayıcı rengi olduğu için bu doğru değildir [8, 0, 255, 255, 1].

Burada bariz bir şey eksik ve yaptığım şeyden tamamen emin olmadığımı itiraf etmekten mutluluk duyuyorum :) Dönüştürülen renk vektörü başka bir koordinat sisteminde mi temsil ediliyor? (ör., 0-255 değil)

Anlayışımın "kayıp bağlantısı" konusunda yardımcı olabilecek herhangi biri varsa, gerçekten minnettar olurum.

Düzenleme

Sadece aşağıdaki matris da çalışır ve aslında (doğru vektör üretir) mathemtically sezgisel olduğunu keşfetti.

-1 0 0 0 0 
0 -1 0 0 0 
0 0 -1 0 0 
1 1 1 1 0 
0 0 0 0 1 

Bu yüzden yeni sorum şu: bu matrislerin ikisi de neden çalışıyor? Sonuncusu bana daha cebri bir perspektiften neden çalıştığını anlayabildiğimden daha tatmin edici bir çözüm sunuyor. Dört sıra ölçekleme için kullanılır mı? Ve eğer öyleyse, ölçekleme neden 255 ekler? Bu değeri nereden alıyor?

Bunlar gerçekten aptal sorularsa özür dilerim, bunu aşağıya indirmeye çalışıyorum.

+2

Ardından, alt satırda 1-s'yi unutuyorsunuz. Onlar eklenir (255 ölçeklendirilir). 255 + -247 = 8. –

+0

Gerçekten mi? Alt satırın çeviri için ölçeklendirmenin yapılmadığını mı düşündüm? –

+0

Gerçek matris cebiri üretemediğinden bunun neden işe yaradığını anlamıyorum 8. Matriste belirli bitlere özel kurallar uygulayan ColorMatrix sınıfı mı? –

cevap

3

Alt satırın çeviri için doğrudur. Hans'ın yaptığı yorumda söylediği şey, 255'in dahil olduğu bir ölçekleme faktörü olduğudur, bu muhtemelen sizi kafa karıştırıcı olan şeydir. Buna bakmanın bir yolu, tüm ARGB değerlerinin ilk önce 255'e bölünmesi, daha sonra matris çarpımının uygulanması ve daha sonra tüm değerlerin doğru ARGB değerlerini vermek için 255 ile çarpılmasıdır. Ona bakmanın bir başka yolu da, tercüme değerlerini 255 olarak düşünmektir. Aynı sonuca iki yoldan ulaşacaksınız.

((247/255) * -1 + 1) * 255 = 8 
or 
247 * -1 + 255 = 8 
+0

Bu ölçekleme değeri 0 ile 1 arasında tutuyor mu? –

+0

Bir soru daha: Postamdaki ikinci matris (düzenleme ile eklenmiş) neden çalışıyor? 4. sıra da çeviri yapıyor mu? –

+0

1) Evet. 2) Alfa kanalının değerini 1 ile çarpılır.Ve alfa kanalınız (durumda) 255 olduğu için, aynı davranışı elde edersiniz. :-) –

İlgili konular