एक बहुत ही आसान दृष्टिकोण एक 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);
}
उहम्म, ऑटो स्तर क्या है? – vodkhang
"ऑटो लेवल" फ़ोटोशॉप जैसे अधिकांश छवि संपादन कार्यक्रमों में एक विकल्प है जो छवि की टोनल रेंज में सुधार करता है। –
यह आशाजनक लग रहा है: http://code.google.com/p/simple-iphone-image-processing/ –