Following code will work for images without alpha channel:
    CGImageRef c = [[UIImage imageNamed:@"100_3077"] CGImage];
    size_t bitsPerPixel = CGImageGetBitsPerPixel(c);
    size_t bitsPerComponent = CGImageGetBitsPerComponent(c);
    size_t width = CGImageGetWidth(c);
    size_t height = CGImageGetHeight(c);
    CGImageAlphaInfo a = CGImageGetAlphaInfo(c);
    NSAssert(bitsPerPixel == 32 && bitsPerComponent == 8 && a == kCGImageAlphaNoneSkipLast, @"unsupported image type supplied");
    CGContextRef targetImage = CGBitmapContextCreate(NULL, width, height, 8, 1 * CGImageGetWidth(c), CGColorSpaceCreateDeviceGray(), kCGImageAlphaNone);
    UInt32 *sourceData = (UInt32*)[((__bridge_transfer NSData*) CGDataProviderCopyData(CGImageGetDataProvider(c))) bytes];
    UInt32 *sourceDataPtr;
    UInt8 *targetData = CGBitmapContextGetData(targetImage);
    UInt8 r,g,b;
    uint offset;
    for (uint y = 0; y < height; y++)
    {
        for (uint x = 0; x < width; x++)
        {
            offset = y * width + x;
            if (offset+2 < width * height)
            {
                sourceDataPtr = &sourceData[y * width + x];
                r = sourceDataPtr[0+0];
                g = sourceDataPtr[0+1];
                b = sourceDataPtr[0+2];
                targetData[y * width + x] = (r+g+b) / 3;
            }
        }
    }
    CGImageRef newImageRef = CGBitmapContextCreateImage(targetImage);
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
    CGContextRelease(targetImage);
    CGImageRelease(newImageRef);
With this code I converted an rgb image to an grayscale image:

Hope this helps