获取数据图像进行处理的最佳方法

时间:2012-05-16 06:56:07

标签: objective-c ios image-processing core-graphics convolution

我想从uiimage获取数据以读取rgb值。我想将这些数据用于卷积滤波器。在互联网上,我发现只有一种方法:

// First get the image into your data buffer
CGImageRef image = [UIImage CGImage];
NSUInteger width = CGImageGetWidth(image);
NSUInteger height = CGImageGetHeight(image);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData_ = malloc(height * width * 4);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel_ * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent,           bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);

CGContextDrawImage(context, CGRectMake(0, 0, width, height));
CGContextRelease(context);

// Now your rawData contains the image data in the RGBA8888 pixel format.
int byteIndex = (bytesPerRow * yy) + xx * bytesPerPixel;
red = rawData[byteIndex];
green = rawData[byteIndex + 1];
blue = rawData[byteIndex + 2];
alpha = rawData[byteIndex + 3];

没问题,但我想在阵列上使用像素这样的像素:[x] [y] [r,b,g]。

我该如何解决?

2 个答案:

答案 0 :(得分:1)

还有另一种获取图像数据的方法:Technical Q&A QA1509: Getting the pixel data from a CGImage object

至于如何访问它,你没有太多选择。多维C数组只能在第二个和后续维度在编译时具有固定大小时才能工作。图像数据没有。

答案 1 :(得分:0)

作为另一种建议,我建议不要在CPU上进行图像卷积。相反,我在GPUImage框架内有各种基于GPU的卷积,比CPU绑定实现快一个数量级。

这些包括高度优化的GPUImageSobelEdgeDetectionFilter和GPUImage3x3ConvolutionFilter,后者可对图像的亮度执行Sobel边缘检测,GPUImage3x3ConvolutionFilter可让您提供适用于任意图像的通用3x3卷积内核。对于实时视频,这些可以轻松实时处理传入的帧。对于UIImages,这些过滤器的运行速度比CPU上执行的卷积快6-10倍。

根据您的具体问题,Ken的建议很好,但实际上我发现Apple在链接文章中建议的数据复制方法实际上比在位图上下文中重绘图像要慢。这看起来很奇怪,但我在基准测试中得到了一致的结果。您在上面呈现的Core Graphics绘图是我发现访问原始UIImage像素数据的最快方法。

相关问题