2010-07-19 11 views
7

मैं अपने आईफोन ऐप में प्रदर्शित होने वाले यूआईएममेज के लिए "ऑटो लेवल" विकल्प को कार्यान्वित करना चाहता हूं। इससे पहले कि मैं इसे स्वयं लागू करने का प्रयास करता हूं, मैं सोच रहा था कि क्या एपीआई में कोई छवि प्रसंस्करण विधियां हैं जिनका उपयोग मैं हिस्टोग्राम आदि के लिए कर रहा हूं, या क्या मुझे अंतर्निहित CGImage को पकड़ना चाहिए और इसे संसाधित करना चाहिए? (मैं iPhone देव के लिए नया हूँ।)UIImage - एक ऑटो लेवल एल्गोरिदम लागू करना

धन्यवाद

एमवी

+0

उहम्म, ऑटो स्तर क्या है? – vodkhang

+0

"ऑटो लेवल" फ़ोटोशॉप जैसे अधिकांश छवि संपादन कार्यक्रमों में एक विकल्प है जो छवि की टोनल रेंज में सुधार करता है। –

+0

यह आशाजनक लग रहा है: http://code.google.com/p/simple-iphone-image-processing/ –

उत्तर

7

एक बहुत ही आसान दृष्टिकोण एक CGImageRef की डिकोड सरणी का उपयोग करना है, लेकिन यह केवल एक सीमा मानचित्रण (कोई गामा, आदि) के लिए मदद कर सकते हैं

const CGFloat decode[6] = {blackPoint,whitePoint,blackPoint,whitePoint,blackPoint,whitePoint}; 

    decodedImage = CGImageCreate(CGImageGetWidth(origImage), 
           CGImageGetHeight(origImage), 
           CGImageGetBitsPerComponent(origImage), 
           CGImageGetBitsPerPixel(origImage), 
           CGImageGetBytesPerRow(origImage), 
           CGImageGetColorSpace(origImage), 
           CGImageGetBitmapInfo(origImage), 
           CGImageGetDataProvider(origImage), 
           decode, 
           YES, 
           CGImageGetRenderingIntent(origImage) 
           ); 

कहाँ श्वेत बिंदु 0.0 और के बीच एक नाव है 1.0, यह निर्धारित करता है कि उत्पादन में शुद्ध सफेद को किस चमक को मैप किया जाएगा, और ब्लैकपॉइंट भी एक फ्लोट है, जो यह निर्धारित करता है कि शुद्ध चमक को किस काले रंग में मैप किया गया है।

डीकोड सरणी के तत्व रंगस्थान के घटकों से मेल खाते हैं, इसलिए यह कोड केवल आरबीजी छवियों के लिए काम करेगा। आप साधारण रंग-सुधार बनाने के लिए घटकों को विभिन्न सफेद और काले मानों पर सेट कर सकते हैं।

आप श्वेत बिंदु और निम्नलिखित समारोह के साथ blackPoint (w/ओ रंग सुधार) की गणना कर सकते हैं:

void CalculateAutocorretionValues(CGImageRef image, CGFloat *whitePoint, CGFloat *blackPoint) { 
    UInt8* imageData = malloc(100 * 100 * 4); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef ctx = CGBitmapContextCreate(imageData, 100, 100, 8, 4 * 100, colorSpace, kCGImageAlphaNoneSkipLast); 
    CGColorSpaceRelease(colorSpace); 

    CGContextDrawImage(ctx, CGRectMake(0, 0, 100, 100), image); 

    int histogramm[256]; 
    bzero(histogramm, 256 * sizeof(int)); 

    for (int i = 0; i < 100 * 100 * 4; i += 4) { 
      UInt8 value = (imageData[i] + imageData[i+1] + imageData[i+2])/3; 
      histogramm[value]++; 
    } 

    CGContextRelease(ctx); 
    free(imageData); 

    int black = 0; 
    int counter = 0; 

    // count up to 200 (2%) values from the black side of the histogramm to find the black point 
    while ((counter < 200) && (black < 256)) { 
      counter += histogramm[black]; 
      black ++; 
    } 

    int white = 255; 
    counter = 0; 

    // count up to 200 (2%) values from the white side of the histogramm to find the white point 
    while ((counter < 200) && (white > 0)) { 
      counter += histogramm[white]; 
      white --; 
    } 

    *blackPoint = 0.0 - (black/256.0); 
    *whitePoint = 1.0 + ((255-white)/256.0); 
} 
1

मुझे नहीं लगता कि मौजूदा एपीआई कि छवि प्रसंस्करण करते हैं, लेकिन मुझे यकीन है कि वहाँ वहाँ तीसरे पक्ष के पुस्तकालयों हैं हूँ ।

0

आप CImg पुस्तकालय की कोशिश कर सकते ... वे docs पर histogram और equalize कार्य हैं। नमूना छवि से बराबर() फ़ंक्शन में बहुत अच्छे परिणाम होते हैं। लाइसेंस एलजीपीएल है, जो आपके प्रोजेक्ट के लिए उपयुक्त नहीं हो सकता है लेकिन ऐप स्टोर पर बिक्री के साथ संगत है।

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