如何使用 ios5 将 RGB 图像转换为 1 通道图像(黑/白)?
输入图像通常是书页的照片。目标是通过将复印件转换为 1 通道图像来减小复印件的大小。
如果我理解您的问题,您想根据像素的亮度对图像应用黑白阈值。要快速执行此操作,您可以使用我的开源GPUImage项目(支持回 iOS 4.x)和它提供的几个图像处理操作。
特别是,GPUImageLuminanceThresholdFilter 和 GPUImageAdaptiveThresholdFilter 可能是您在这里寻找的。前者根据您设置的亮度阈值(默认值为 50%)将像素变为黑色或白色。后者在应用此阈值时会考虑局部平均亮度,这可以为书页上的文本产生更好的结果。
在 UIImage 上使用这些过滤器非常简单:
UIImage *inputImage = [UIImage imageNamed:@"book.jpg"];
GPUImageLuminanceThresholdFilter *thresholdFilter = [[GPUImageLuminanceThresholdFilter alloc] init];
UIImage *quickFilteredImage = [thresholdFilter imageByFilteringImage:inputImage];
这些也可以应用于实时相机馈送和相机拍摄的照片。
您可以使用 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];
这是一些示例代码,可能会有所帮助:
@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 图像,否则它将是黑色的。