2013-03-20 13 views
6

मैं एक एप्लीकेशन बना रहा हूं जो CIAreaHistogram कोर छवि फ़िल्टर का उपयोग करता है। मैं करने के लिए परीक्षण के लिए 10 के एक inputCount मूल्य (बकेट की संख्या), और के 1.सीआईएरिया हिस्टोग्राम इनपुटस्केल कारक

एक inputScale मान का उपयोग मैं हिस्टोग्राम ही है, जो मैं तो एक कस्टम कर्नेल (पोस्ट के अंत देखें) के माध्यम से चलाने के लिए CIImage मिल अल्फा मानों को 1 पर सेट करें (अन्यथा हिस्टोग्राम गणना से अल्फा मान premultiplied है) और फिर इसे NSBitmapImageRep में परिवर्तित करें।

मैं फिर छवि प्रतिनिधि के बफर से स्कैन करता हूं और आरजीबी मानों को मुद्रित करता हूं (अल्फा मानों को छोड़कर)। हालांकि, जब मैं ऐसा करता हूं, तो 10 में आर, जी, और बी मानों का योग आवश्यक रूप से 255 तक नहीं जोड़ता है।

उदाहरण के लिए, पूरी तरह से काले छवि के साथ, मैं हिस्टोग्राम लागू करता हूं, फिर कस्टम

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 

इस रूप में मैं उम्मीद है, के बाद से सभी पिक्सल काला कर रहे हैं, तो सब कुछ पहले बाल्टी में है: गिरी, और निम्न उत्पादन मिलता है। - वे को जोड़ नहीं है 255 से इसका कारण यह है समस्याओं का कारण बनता

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 

आर, जी, और बी के लिए मान जोड़ें: हालांकि, अगर मैं एक रंग छवि के साथ एक ही एल्गोरिथ्म चलाने के लिए, मैं निम्नलिखित मिल मुझे इनमें से दो हिस्टोग्राम की तुलना करने की आवश्यकता है, और मेरे एल्गोरिदम की अपेक्षा है कि रकम 0 और 255 के बीच हो। मैं स्पष्ट रूप से इन मानों को स्केल कर सकता हूं, लेकिन मैं प्रदर्शन कारणों से उस अतिरिक्त चरण से बचना चाहता हूं।

मैंने कुछ और दिलचस्प देखा जो कुछ संकेत दे सकता है कि यह क्यों हो रहा है। मेरे कस्टम कर्नेल में, मैंने बस अल्फा मान को 1 पर सेट किया। मैंने एक दूसरा कर्नेल (पोस्ट का अंत देखें) की कोशिश की जो सभी पिक्सल को लाल रंग में सेट करता है। स्पष्ट रूप से, हरे और नीले मान शून्य हैं। हालांकि, मुझे बिटमैप प्रतिनिधि से मानों की जांच करते समय यह परिणाम मिलता है:

RGB: 255 43 25 

लेकिन मैंने बस जी और बी को शून्य पर सेट किया है! यह समस्या का हिस्सा प्रतीत होता है, जो रंग प्रबंधन को इंगित करता है। लेकिन चूंकि मैं स्पष्ट रूप से कर्नेल में मूल्यों को निर्धारित है, वहाँ जहां यह हो रहा जा सकता है कोड का केवल एक ब्लॉक है - फिल्टर से CIImage से एक NSBitmapImageRep करने के लिए रूपांतरण:

NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCIImage:kernelOutput]; 
unsigned char *buf = [bitmapRep bitmapData]; 

एक बार मैं 255 आरजीबी के लिए पिक्सल सेट 0 0, फिर उन पंक्तियों को निष्पादित करें, फिर बफर पढ़ें, आरजीबी मान सभी 255 43 25 हैं। मैंने मूल CGImageRef की रंगीन जगह को सेट करने का प्रयास किया है जिस पर संपूर्ण वर्कफ़्लो kCGColorSpaceGenericRGB पर आधारित है, सोच रहा है कि रंग प्रोफ़ाइल हो सकती है के माध्यम से ले, लेकिन कोई फायदा नहीं हुआ।

क्या कोई मुझे बता सकता है कि CIFilter कर्नेल इस तरह से व्यवहार करेगा, और मैं इसे कैसे हल कर सकता हूं?

जैसा कि पहले बताया गया है, यहां उपयोग किए गए सीआईफ़िल्टर कर्नेल कार्यों की प्रतियां यहां दी गई हैं। सबसे पहले, एक है कि 1 करने के लिए अल्फा सेट:

kernel vec4 adjustHistogram(sampler src) 
{ 
    vec4 pix = sample(src, destCoord()); 
    pix.a = 1.0; 
    return pix; 
} 

और अगले एक है कि सभी पिक्सल सेट 255 0 0 आरजीबी के लिए लेकिन यह है कि 255 43 25 समाप्त होता है एक बार यह NSBitmapImageRep में धर्मान्तरित:

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; 
} 

आपकी मदद के लिए अग्रिम धन्यवाद।

उत्तर

0

आप केवल जब एक कस्टम मुख्य छवि फिल्टर का उपयोग कर (या जब भी आप एक नया CIImage वस्तु पैदा कर रहे हैं या किसी मौजूदा स्थान ले रही हैं) पैदा करते हैं और एक हिस्टोग्राम प्रदर्शित करने के लिए कोड की एक पंक्ति की जरूरत है:

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