2015-05-21 4 views
23

मैं कोर छवि फ़िल्टर का उपयोग कर अपने मैक ऐप में छवियों में कुछ रंग सुधार जोड़ने की कोशिश कर रहा हूं। सबसे पहले, मैं एक छवि से एक कलाकार को हटाने के लिए एक कस्टम सफेद संतुलन की अनुमति देने के लिए देख रहा हूँ। ऐसा लगता है कि CIWhitePointAdjust ठीक वही था जो मैं ढूंढ रहा हूं, लेकिन इसे आजमाने के बाद, मुझे यकीन नहीं है कि मैं इसका गलत उपयोग कर रहा हूं, या अगर ऐसा नहीं होता जो मैंने सोचा था।कोर छवि फ़िल्टर का उपयोग करके आप छवि को संतुलित रूप से कैसे रंगते हैं?

इस छवि के साथ शुरू, उम्र के साथ पीले, और उसके दाहिने किनारे पर सफेद रंग की एक पतली पट्टी के साथ:

NSColor *whiteSample = // Chosen from the speech bubble's background 
CIColor *whiteInputColor = [[CIColor alloc] initWithColor:whiteSample]; 

layer.filters = @[ 
    [CIFilter filterWithName:@"CIWhitePointAdjust" 
     withInputParameters:@{kCIInputColorKey: whiteInputColor}] 
]; 

और:

Original image

मैं तो जैसे फिल्टर लागू, इस छवि को वापस प्राप्त करें:

Image after applying CIFilter

ध्यान दें कि यह मूल (मेरे वांछित प्रभाव के विपरीत) से गहरा और गहरा दिखता है। मैं और अधिक में फ़ोटोशॉप एक स्वतः रंग कर की तरह एक प्रभाव की उम्मीद कर रहा था, तो जैसे:

Photoshopped color balance

मैं CIWhitePointAdjust गलत तरीके से उपयोग कर रहा हूँ, या यह इस काम के लिए गलत उपकरण है? यदि फिल्टर का एक और फ़िल्टर या संयोजन बेहतर काम करेगा, तो मुझे जानना अच्छा लगेगा।

चूंकि मैं पहले से ही CALayer वस्तुओं में छवियों में हेरफेर कर रहा हूं, कोर छवि फ़िल्टर निश्चित रूप से सही विकल्प की तरह लगते हैं, लेकिन यदि यह केवल किसी अन्य माध्यम से संभवतः किया जा सकता है, तो मैं इसके लिए खुला हूं।

अद्यतन

एक helpful answer सिग्नल प्रोसेसिंग मुझे साइट पर मैं क्या लागू करने के लिए कोशिश कर रहा हूँ के नाम दें। व्यापक रूप से, इसे हिस्टोग्राम इक्विलाइजेशन कहा जाता है। मैं यह समझने की कोशिश कर रहा हूं कि कोर छवि फ़िल्टर (ओं) का उपयोग करके उस प्रक्रिया को करने का कोई तरीका है और अब तक, यह बहुत उम्मीद नहीं कर रहा है (मुझे अपना खुद का लेखन किए बिना)।

+0

यह उपयोगी हो सकता है: http://stackoverflow.com/a/15972314/341994 – matt

+0

@ मैट धन्यवाद, लेकिन मैंने पहले से ही कोशिश की और यह बहुत ही कमजोर लग रहा था। कलर तापमान समायोजन टिंट को समायोजित किए बिना कुछ भी नहीं कर रहा है, यहां तक ​​कि टिंट के साथ भी मैं छवि को सही दिखने के लिए नहीं मिला, और मैं उपयोगकर्ता को टिंट स्लाइडर नहीं देना चाहता हूं। यह तस्वीरों के लिए वास्तविक रंग तापमान समायोजन करने की दिशा में तैयार है, जो मेरा लक्ष्य नहीं है। – Dov

+0

क्या आपने सीआईसीओलर कंट्रोल्स का उपयोग करके छवि को थोड़ा सा असंतोष करने की कोशिश की है? – joelg

उत्तर

-1

autoAdjustmentFilters or autoAdjustmentFiltersWithOptions के साथ संभव फ़िल्टरों की एक सूची प्राप्त करने का प्रयास करें ... शायद बाद वाले ताकि आप उन फ़िल्टरों को बहिष्कृत कर सकें जिनके लिए चेहरे का पता लगाने की आवश्यकता है, यदि आप कार्टून स्कैन को स्वतः समायोजित करने की योजना बनाते हैं।

+0

यह एक अच्छा विचार है (और मुझे उम्मीद है कि यह काम करेगा), लेकिन मैंने परीक्षण छवि पर इसका प्रयास किया है, और ऐसा लगता है कि यह समग्र स्तर को समायोजित करता है, लेकिन रंग बदलने के लिए किसी भी फ़िल्टर को वापस नहीं करता है संतुलन। विशेष रूप से, यह इन फ़िल्टरों को वापस करता है: 'CIVibrance',' CIToneCurve', और 'CIHighlightShadowAdjust')। यह निराशाजनक है :-( – Dov

2

ठीक है, तो मुझे लगता है कि मैंने इसे खींचा है!

@import Accelerator; 

// I haven't yet found a way to do it within Core Image 

// use this when you need to CIImage* -> CGImageRef 
CIImage *ciImage = [CIImage imageWithCGImage:cgImage]; 

... 

// use this when you need to CGImageRef -> CIImage* 
CIContext* context = [[CIContext alloc] init]; 
CGImageRef cgImage = [context createCGImage:ciImage fromRect:ciImage.extent]; 

... 

// the algorithm itself, which uses vImage and has to convert to/from it via CGImage 
CGImageRef CreateEqualisedCGImageFromCGImage(CGImageRef original) 
{ 
    vImage_Error err; 
    vImage_Buffer _img; 
    vImage_CGImageFormat format = { 
     .bitsPerComponent = 8, 
     .bitsPerPixel = 32, 
     .colorSpace = NULL, 
     .bitmapInfo = (CGBitmapInfo)kCGImageAlphaFirst, 
     .version = 0, 
     .decode = NULL, 
     .renderingIntent = kCGRenderingIntentDefault, 
    }; 

    CGFloat width = CGImageGetWidth(original); 
    CGFloat height = CGImageGetHeight(original); 

    vImage_Buffer _dstA, _dstR, _dstG, _dstB; 

    err = vImageBuffer_InitWithCGImage(&_img, &format, NULL, original, kvImageNoFlags); 
    if (err != kvImageNoError) 
     NSLog(@"vImageBuffer_InitWithCGImage error: %ld", err); 

    err = vImageBuffer_Init(&_dstA, height, width, 8 * sizeof(uint8_t), kvImageNoFlags); 
    if (err != kvImageNoError) 
     NSLog(@"vImageBuffer_Init (alpha) error: %ld", err); 

    err = vImageBuffer_Init(&_dstR, height, width, 8 * sizeof(uint8_t), kvImageNoFlags); 
    if (err != kvImageNoError) 
     NSLog(@"vImageBuffer_Init (red) error: %ld", err); 

    err = vImageBuffer_Init(&_dstG, height, width, 8 * sizeof(uint8_t), kvImageNoFlags); 
    if (err != kvImageNoError) 
     NSLog(@"vImageBuffer_Init (green) error: %ld", err); 

    err = vImageBuffer_Init(&_dstB, height, width, 8 * sizeof(uint8_t), kvImageNoFlags); 
    if (err != kvImageNoError) 
     NSLog(@"vImageBuffer_Init (blue) error: %ld", err); 

    err = vImageConvert_ARGB8888toPlanar8(&_img, &_dstA, &_dstR, &_dstG, &_dstB, kvImageNoFlags); 
    if (err != kvImageNoError) 
     NSLog(@"vImageConvert_ARGB8888toPlanar8 error: %ld", err); 

    err = vImageEqualization_Planar8(&_dstR, &_dstR, kvImageNoFlags); 
    if (err != kvImageNoError) 
     NSLog(@"vImageEqualization_Planar8 (red) error: %ld", err); 

    err = vImageEqualization_Planar8(&_dstG, &_dstG, kvImageNoFlags); 
    if (err != kvImageNoError) 
     NSLog(@"vImageEqualization_Planar8 (green) error: %ld", err); 

    err = vImageEqualization_Planar8(&_dstB, &_dstB, kvImageNoFlags); 
    if (err != kvImageNoError) 
     NSLog(@"vImageEqualization_Planar8 (blue) error: %ld", err); 

    err = vImageConvert_Planar8toARGB8888(&_dstA, &_dstR, &_dstG, &_dstB, &_img, kvImageNoFlags); 
    if (err != kvImageNoError) 
     NSLog(@"vImageConvert_Planar8toARGB8888 error: %ld", err); 

    err = vImageContrastStretch_ARGB8888(&_img, &_img, kvImageNoError); 
    if (err != kvImageNoError) 
     NSLog(@"vImageContrastStretch_ARGB8888 error: %ld", err); 

    free(_dstA.data); 
    free(_dstR.data); 
    free(_dstG.data); 
    free(_dstB.data); 

    CGImageRef result = vImageCreateCGImageFromBuffer(&_img, &format, NULL, NULL, kvImageNoFlags, &err); 
    if (err != kvImageNoError) 
     NSLog(@"vImageCreateCGImageFromBuffer error: %ld", err); 

    free(_img.data); 

    return result; 
} 

समाधान की योग्यता https://stackoverflow.com/users/4735340/james-bush करने के लिए सभी जाता है, लेकिन मैं इतने लंबे समय के लिए एक छवि उन्मुख समाधान के लिए सफलता के बिना देखा है (के रूप में: यहाँ है कि मैं क्या https://stackoverflow.com/a/30447041/734860 से एक साथ clobbered है और गोंद बिट्स के एक जोड़े है उस प्रश्न में चर्चा की गई वीडियो प्रोसेसिंग का विरोध) कि मुझे लगता है कि एक तैयार उत्तर जैसे कि यह प्रासंगिक है। ओएस एक्स या आईओएस पर 'ऑटोलेवल' की तलाश में मुझे कहीं भी नहीं मिला, मुझे उम्मीद है कि यह किसी और के लिए उपयोगी हो सकता है।

+0

कृपया स्विफ्ट संस्करण साझा करें – ChanWarde

संबंधित मुद्दे

 संबंधित मुद्दे