2010-07-19 6 views
7

iPhone 응용 프로그램에 표시 할 UIImage에 "자동 레벨"옵션을 구현하고 싶습니다. 내가 직접 구현하려고하기 전에 히스토그램 등을 사용해야하는 API에 이미지 처리 메소드가 있는지 궁금 해서요. 아니면 기본 CGImage를 잡고 처리해야합니까?UIImage - 자동 레벨 알고리즘 구현

감사

MV 나는 이미지 프로세싱을 기존의 API가 있다고 생각하지 않습니다

+0

음, 자동 레벨이란 무엇입니까? – vodkhang

+0

"자동 레벨"은 Photoshop과 같은 대부분의 이미지 편집 프로그램에서 이미지의 색조 범위를 향상시키는 옵션입니다. –

+0

유망 해 보입니다. http://code.google.com/p/simple-iphone-image-processing/ –

답변

7

한 매우 쉬운 방법은 CGImageRef의 디코드 어레이를 사용하지만, 이것은 단지 범위 매핑 (NO 감마 등)의 도움을 줄 수있다

화이트 포인트 0.0 사이 플로트가
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) 
           ); 

1.0은 출력에서 ​​순수한 흰색에 매핑 할 밝기를 결정하고 blackPoint는 순수한 검정에 매핑되는 밝기를 결정하는 부동 소수점입니다.

디코드 배열의 요소는 색상 공간의 구성 요소에 해당하므로이 코드는 RBG 이미지에서만 작동합니다. 구성 요소를 다른 흰색과 검은 색 값으로 설정하여 간단한 색상 보정을 만들 수 있습니다.

당신은 화이트 포인트와 (색상 보정 O/w) 다음과 같은 기능을 가진 blackPoint을 계산할 수 있습니다 : 당신은 CImg 라이브러리를 시도 할 수

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

(I은. 아이폰 dev에 새로운 오전),하지만 난 타사 라이브러리 거기 밖으로 확신 해요 .

0

... 그들은 docshistogramequalize 기능을 가지고 있습니다. equalize() 함수는 샘플 이미지에서 꽤 괜찮은 결과를 보여줍니다. 라이선스는 귀하의 프로젝트에 적합하지 않을 수도 있지만 앱 스토어에서 판매하는 것과 호환되는 LGPL입니다.