मैं एक एप्लीकेशन बना रहा हूं जो 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;
}
आपकी मदद के लिए अग्रिम धन्यवाद।