CIAreaHistogram
Çekirdek Resim filtresini kullanan bir uygulama yapıyorum. I ı daha sonra özel bir çekirdek (yazının sonuna bakınız) kadar devam histogram kendisi için CIImage
elde testleri için, 10 bir inputCount
değeri (kova sayısı) ve 1.CIAreaHistogram inputScale factor
bir inputScale
değerini kullanın alfa değerlerini 1 olarak ayarlayın (aksi halde histogram hesaplamalarından alfa değeri öntanımlıdır) ve daha sonra bir NSBitmapImageRep
'a dönüştürün.
Daha sonra görüntü temsilcisi arabelleğini tara ve RGB değerlerini (alfa değerlerini atlama) yazdırıyorum. Ancak, bunu yaptığımda, R, G ve B değerlerinin toplamı, 10'a kadar toplamı 255'e kadar eklemez.
Örneğin, tamamen siyah bir görüntüyle, histogramı, sonra da özel olarak uygularım. beklediğim gibi tüm pikseller siyah olduğundan
RGB: 255 255 255
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
Bu, bir, yani her şey birinci kova içinde: çekirdek ve aşağıdaki çıktıyı almak. - Takviye katmayan 255 Bu sorunları nedeniyle neden
RGB: 98 76 81
RGB: 164 97 87
RGB: 136 161 69
RGB: 100 156 135
RGB: 80 85 185
RGB: 43 34 45
RGB: 31 19 8
RGB: 19 7 3
RGB: 12 5 2
RGB: 16 11 11
R, G ve B değerlerini toplayın: Bir renkli resimle aynı algoritmayı çalıştırmak Ancak, aşağıdaki alıyorum Bu histogramların ikisini karşılaştırmam gerekiyor ve algoritmam toplamların 0 ile 255 arasında olmasını bekliyor. Bu değerleri açıkça ölçebiliyordum ama performans nedenlerinden dolayı bu fazladan adım atmak istemiyorum.
Bunun neden olduğuna dair bir ipucu veren ilginç başka bir şey farkettim. Özel çekirdeğimde, alfa değerini 1 olarak ayarladım. Tüm pikselleri kırmızıya ayarlayan ikinci çekirdeği (gönderinin sonuna bakın) denedim. Açık yeşil ve mavi değerler sıfırdır.
RGB: 255 43 25
Ama sadece sıfır G ve B ayarlayın: Bitmap temsilcisi değerleri kontrol ederken Ancak, bu sonuç almak! Bu renk yönetimini gösteren problemin bir parçası gibi görünüyor. Ben açıkça çekirdeğindeki değerleri ayarlamak beri Ancak, bu gerçek olabilir kod sadece bir blok var - filtreden CIImage bir NSBitmapImageRep dönüşüm:
NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCIImage:kernelOutput];
unsigned char *buf = [bitmapRep bitmapData];
Ben 255 RGB pikselleri ayarladıktan sonra 0 0, sonra bu satırları yürütün, sonra arabelleği okuyun, RGB değerlerinin hepsi 255 43 25. Ayrıca, tüm iş akışının kCGColorSpaceGenericRGB
'a dayandığı orijinal CGImageRef'in renk alanını ayarlamaya çalıştım. Taşınıyor, ama boşuna.
Birisi bana neden bir CIFilter
çekirdeğinin bu şekilde davranacağını ve nasıl çözebileceğimi söyleyebilir mi?
Daha önce de belirtildiği gibi, kullandığım CIFilter çekirdek işlevlerinin kopyaları burada verilmiştir. İlk olarak, 1'e alfa setleri tek:
kernel vec4 adjustHistogram(sampler src)
{
vec4 pix = sample(src, destCoord());
pix.a = 1.0;
return pix;
}
Ve gelecek, tüm pikselleri belirlerim 255 0 0 RGB ama NSBitmapImageRep
dönüşür kez o 255 43 25 biter:
kernel vec4 adjustHistogram(sampler src)
{
vec4 pix = sample(src, destCoord());
pix.r = 1.0; pix.g = 0.0; pix.b = 0.0;
pix.a = 1.0;
return pix;
}
Yardımlarınız için şimdiden teşekkür ederiz.