एक इनपुट छवि के लिए एक कनवल्शन कर्नेल को लागू करने से ठीक उसी आयाम के साथ एक आउटपुट छवि उत्पन्न होनी चाहिए। फिर भी, जब CIImage पर गैर-शून्य पूर्वाग्रह के साथ CIFilter.convolution3x3 का उपयोग करते हैं, तो आउटपुट का निरीक्षण करने से पता चलता है कि चौड़ाई, ऊंचाई और मूल निर्देशांक अनंत में तिरछे हो गए हैं, विशेष रूप से CGFloat.greatestFiniteMagnitude। मैंने इस फ़िल्टर के 5x5 और 7x7 संस्करणों की कोशिश की है और मैंने अलग-अलग वज़न और पूर्वाग्रह सेट करने का प्रयास किया है और निष्कर्ष समान है - यदि पूर्वाग्रह शून्य के अलावा कुछ भी है तो आउटपुट छवि का आकार और मूल समन्वय बर्बाद हो जाता है।

इस फ़िल्टर के लिए दस्तावेज़ यहां.

यहाँ कुछ कोड है ...

// create the filter
let convolutionFilter = CIFilter.convolution3X3()
convolutionFilter.bias = 1 // any non zero bias will do

// I'll skip setting convolutionFilter.weights because the filter's default weights (an identity matrix) should be fine

// make your CIImage input
let input = CIImage(...) // I'm making mine from data I got from the camera

// lets print the size and position so we can compare it with the output
print(input.extent.width, input.extent.height, input.extent.origin) // -> 960.0 540.0 (0.0, 0.0)

// pass the input through the filter
convolutionFilter.inputImage = input
guard let output = convolutionFilter.outputImage else {
    print("the filter failed for some reason")
}

// the output image now contains the instructions necessary to perform the convolution,
// but no processing has actually occurred; even so, the extent property will have
// been updated if a change in size or position was described

// examine the output's size (it's just another CIImage - virtual, not real)
print(output.extent.width, output.extent.height, output.extent.origin) // -> 1.7976931348623157e+308 1.7976931348623157e+308 (-8.988465674311579e+307, -8.988465674311579e+307)

ध्यान दें कि 1.7976931348623157e+308 CGFloat.greatestFiniteMagnitude है।

ऐसा नहीं होना चाहिए। केवल अन्य जानकारी जो मैं प्रदान कर सकता हूं वह यह है कि मैं आईओएस 13.5 पर इस कोड को चला रहा हूं और सीआईएममेज जो मैं फ़िल्टर कर रहा हूं उन्हें सीवीपिक्सलबफर से सीएमएसम्पलबफर से पकड़ा जा रहा है जो स्वचालित रूप से डिवाइस के कैमरा फीड द्वारा मेरे कोड पर वितरित किए जाते हैं। फिल्टर से गुजरने से पहले चौड़ाई और ऊंचाई 960x540 है।

1
bd1170 12 जून 2020, 22:37

1 उत्तर

सबसे बढ़िया उत्तर

हालाँकि यह कहीं भी प्रलेखित प्रतीत नहीं होता है, यह सामान्य व्यवहार प्रतीत होता है जैसा कि @matt ने सुझाव दिया था, हालाँकि मुझे नहीं पता कि bias निर्णायक कारक क्यों है। सामान्य तौर पर मुझे संदेह है कि इसका इस तथ्य से कुछ लेना-देना है कि किनारे के पिक्सेल को संसाधित करते समय CIFilter के कनवल्शन को छवि की प्रारंभिक सीमा के बाहर संचालित होना चाहिए; कर्नेल किनारे और उसके बाहर अपरिभाषित क्षेत्र को ओवरलैप करता है, जिसे वर्चुअल आरजीबीए (0,0,0,0) पिक्सल के अनंत स्थान के रूप में माना जाता है।

सीमा को अनंत में बदलने के बाद, मूल छवि पिक्सेल स्वयं अभी भी अपने मूल मूल बिंदु और चौड़ाई/ऊंचाई पर हैं, इसलिए आपको उन्हें समान मूल और चौड़ाई/ऊंचाई वाले लक्ष्य पिक्सेल बफर में प्रस्तुत करने में कोई परेशानी नहीं होगी; इस प्रतिपादन के लिए आप जिस CIContext का उपयोग करते हैं, वह केवल उन "वर्चुअल" पिक्सेल को अनदेखा कर देगा जो लक्ष्य पिक्सेल बफर की सीमा से बाहर हैं।

ध्यान रखें कि आपके दृढ़ संकल्प का आपकी छवि के किनारों पर अनपेक्षित प्रभाव हो सकता है क्योंकि उनके निकट आभासी आरजीबीए (0,0,0,0) पिक्सेल के साथ बातचीत होती है, जिससे आपको लगता है कि प्रतिपादन गलत या गलत तरीके से हुआ है। अक्सर यदि आप कनवल्शन को लागू करने से पहले अपने CIImage की clampedToExtent() विधि का उपयोग करते हैं तो ऐसी समस्याओं से बचा जा सकता है।

0
bd1170 25 जून 2020, 19:05