2013-03-20 8 views
6

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.

cevap

0

(yeni CIImage nesnesi oluştururken veya mevcut bir değiştiriyorsanız zaman ya) özel Çekirdek Görüntü filtresi kullanırken sadece üretmek ve bir histogram görüntülemek için bir kod satırı gerekir:

return [CIFilter filterWithName:@"CIHistogramDisplayFilter" keysAndValues:kCIInputImageKey, self.inputImage, @"inputHeight", @100.0, @"inputHighLimit", @1.0, @"inputLowLimit", @0.0, nil].outputImage; 
İlgili konular