将RGB图像转换为1通道图像(黑/白)

时间:2013-03-27 13:36:45

标签: ios ios5 core-image

如何使用ios5将RGB图像转换为1通道图像(黑/白)?

输入图像通常是书页的照片。 目标是通过将复印件转换为1通道图像来缩小复印件的尺寸。

3 个答案:

答案 0 :(得分:3)

如果我理解您的问题,您希望根据像素的亮度对图像应用黑白阈值处理。要快速执行此操作,您可以使用我的开源GPUImage项目(支持iOS 4.x)以及它提供的一些图像处理操作。

特别是,GPUImageLuminanceThresholdFilter和GPUImageAdaptiveThresholdFilter可能就是您在这里寻找的内容。前者根据您设置的亮度阈值将像素变为黑色或白色(默认值为50%)。后者在应用此阈值时会考虑局部平均亮度,这可以为书籍上的文本产生更好的结果。

在UIImage上使用这些过滤器非常简单:

UIImage *inputImage = [UIImage imageNamed:@"book.jpg"];
GPUImageLuminanceThresholdFilter *thresholdFilter = [[GPUImageLuminanceThresholdFilter alloc] init];
UIImage *quickFilteredImage = [thresholdFilter imageByFilteringImage:inputImage];

这些也适用于实时相机送纸和相机拍摄的照片。

答案 1 :(得分:0)

您可以使用Core Image将图像处理为黑色和白色。

使用CIEdgeWork,这会将您的图片转换为黑色和

有关核心图像编程的更多信息,请访问: - https://developer.apple.com/library/ios/#documentation/GraphicsImaging/Conceptual/CoreImaging/ci_tasks/ci_tasks.html#//apple_ref/doc/uid/TP30001185-CH3-TPXREF101

您正在寻找的代码可能就是:

CIContext *context = [CIContext contextWithOptions:nil]; // 1
CIImage *image = [CIImage imageWithContentsOfURL:myURL]; // 2
CIFilter *filter = [CIFilter filterWithName:@"CIEdgeWork"]; // 3
[filter setValue:image forKey:kCIInputImgeKey];
[filter setValue:[NSNumber numberWithFloat:0.8f] forKey:@"InputIntensity"];
CIImage *result = [filter valueForKey:kCIOutputImageKey]; // 4
CGImageRef cgImage = [context createCGImage:result fromRect:[result extent];

答案 2 :(得分:0)

这里有一些示例代码,可能有帮助:

@implementation UIImage (GrayImage)

-(UIImage*)grayImage
{
    int width = self.size.width;
    int height = self.size.height;

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    CGContextRef context = CGBitmapContextCreate
(nil,width,height,8,0,colorSpace,kCGImageAlphaNone);
    CGColorSpaceRelease(colorSpace);

    if (context == NULL) {
        return nil;
    }

    CGContextDrawImage(context,CGRectMake(0, 0, width, height), self.CGImage);
    CGImageRef cgImage = CGBitmapContextCreateImage(context);
    UIImage *grayImage = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);
    CGContextRelease(context);

    return grayImage;
}

@end

我只是把它写成UIImage的类别,但不支持png图像,它有透明像素或者是黑色。