2010-07-19 39 views
7

Tôi muốn triển khai tùy chọn "mức tự động" cho UIImage mà tôi đang hiển thị trong ứng dụng iPhone của mình. Trước khi tôi cố gắng thực hiện nó bản thân mình, tôi đã tự hỏi nếu có bất kỳ phương pháp xử lý hình ảnh trong các API tôi nên sử dụng, cho biểu đồ, vv Hoặc tôi chỉ cần lấy CGImage cơ bản và xử lý nó? (Tôi mới vào dev iPhone.)UIImage - triển khai thuật toán cấp tự động

Cảm ơn

MV

+0

Uhmm, mức tự động là gì? – vodkhang

+0

"Auto Levels" là một tùy chọn trong hầu hết các chương trình chỉnh sửa hình ảnh như Photoshop giúp cải thiện phạm vi âm của hình ảnh. –

+0

Điều này có vẻ đầy hứa hẹn: http://code.google.com/p/simple-iphone-image-processing/ –

Trả lời

7

Một cách tiếp cận rất dễ dàng là sử dụng các mảng giải mã của một CGImageRef, nhưng điều này chỉ có thể giúp cho một bản đồ phạm vi (không gamma vv)

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) 
           ); 

đâu Điểm trắng của là một phao giữa 0,0 và 1.0, xác định độ sáng nào sẽ được ánh xạ tới màu trắng tinh khiết trong đầu ra, và blackPoint cũng là một phao, xác định độ sáng nào được ánh xạ tới màu đen thuần túy.

Các phần tử của mảng giải mã tương ứng với các thành phần của không gian màu, vì vậy mã này sẽ chỉ hoạt động đối với hình ảnh RBG. Bạn có thể đặt các thành phần thành các giá trị trắng và đen khác nhau để tạo ra một hiệu chỉnh màu đơn giản.

Bạn có thể tính toán điểm trắng và blackPoint với hàm sau (w/o hiệu chỉnh màu sắc):

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

Tôi không nghĩ rằng có API hiện có mà làm xử lý hình ảnh, nhưng tôi chắc chắn có những thư viện của bên thứ ba trên mạng .

0

Bạn có thể thử các thư viện CImg ... Họ có histogramequalize chức năng trên docs. Hàm equalize() có kết quả khá tốt, từ ảnh mẫu. Giấy phép là LGPL, có thể không phù hợp với dự án của bạn nhưng tương thích với việc bán trên cửa hàng ứng dụng.

Các vấn đề liên quan