2

Я хочу получить данные из 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]; 

Его хорошо, но я хочу работать с пикселями на массив некоторые, как это: [х] [у] [г, б, г].

Как я могу это решить?

ответ

1

Там другой способ, чтобы получить данные изображения: Technical Q&A QA1509: Getting the pixel data from a CGImage object

касается того, как вы к нему доступ, вы не имеете выбора. Многомерные массивы C могут работать только тогда, когда второй и последующие измерения имеют фиксированный размер, известный во время компиляции. Данные изображения отсутствуют.

0

Как альтернативное предложение, я бы рекомендовал не выполнять свертку изображений на процессоре. Вместо этого у меня есть множество сверток на основе GPU в моей инфраструктуре GPUImage, которая может быть на порядок быстрее, чем реализации, связанные с CPU.

К ним относятся сильно оптимизированный GPUImageSobelEdgeDetectionFilter, который выполняет обнаружение края Sobel на яркости изображения и GPUImage3x3ConvolutionFilter, который позволяет вам предоставить общее ядро ​​свертки 3x3 для применения к произвольному изображению. Для видео в реальном времени они могут легко обрабатывать входящие кадры в реальном времени. Для UIImages эти фильтры могут работать на 6-10X быстрее, чем свертки, выполняемые на CPU.

В соответствии с вашим конкретным вопросом предложение Кена является хорошим, но на практике я обнаружил, что подход к копированию данных, предлагаемый Apple в связанной статье, на самом деле заканчивается медленнее, чем перерисовка изображения в растровом контексте. Это кажется странным, но я получаю последовательные результаты по этому поводу в моих тестах. Основной графический чертеж, который вы представляете выше, является самым быстрым способом, который я нашел для доступа к необработанным данным пикселя UIImage.

Смежные вопросы