2013-02-10 2 views
1

Я разрабатываю одно приложение. У меня есть требование, как мое приложение должно обнаружить определенный цвет изображения. Напр. если я хочу обнаружить красный цвет, тогда я должен видеть только красные области изображения. Я попробовал это, следующим образом:Работа с RGB изображения

psudocode:

Сначала я получил информацию о каждом пикселе изображения в виде RGB с помощью:

for(int i=0; i < width; ++i) 
{ 
    for (int j=0; j <height; j++) 
    { 
     byteIndex = (bytesPerRow * j) + i * bytesPerPixel; 

     CGFloat red = (rawData[byteIndex]  * 1.0) /255.0; 
     CGFloat green = (rawData[byteIndex + 1] * 1.0)/255.0 ; 
     CGFloat blue = (rawData[byteIndex + 2] * 1.0)/255.0 ; 
     if (red>0.9 && red<1) 
     { 
      rgba[byteIndex] =red*255; 
      rgba[byteIndex+1] =green*0 ; 
      rgba[byteIndex+2] = blue*0; 
      count++; 

     } 

    } 

} 

тогда я присваивая эту информацию другому изображению с нулевым синим и зеленым участком, поэтому я могу видеть только красные области изображения. Он работает нормально.

Но проблема в том, что цикл for. Я должен перебирать цикл в зависимости от высоты и ширины изображения. Например, например, Если высота изображения равна 300, а ширина - 400, тогда приходится перебирать цикл for 300 * 400 = 120000 раз. Что я не думаю, это лучший способ. Так есть ли способ сделать это эффективно? есть ли библиотека с открытым исходным кодом для достижения этой цели?

+0

Я не пробовал это, но вы можете попробовать GPUImage и использовать либо GPUImageRGBFilter для настройки значений RGB образа, или GPUImageLookupFilter карту прочь зеленого и синего. –

+0

Это очень малое количество простой обработки для текущих стандартов, и поскольку вам нужно посетить каждый пиксель, чтобы выполнить фильтрацию, которую вы выполняете, это в значительной степени сложность задачи (линейная). Это означает, что вы можете получить некоторое постоянное улучшение, используя некоторую библиотеку, которая делает вещи немного умнее. Но кроме этого, кроме этого тривиального приложения, с которым вы играете, отличительные цвета в RGB могут привести к плохим результатам. Вместо этого вы должны проверить цветовые пространства, которые выделяют один канал для оттенка, например HSB и другие. – mmgp

ответ

0

Вы можете начать оптимизацию кода. Существует множество ненужных операций и конверсий float/integer.

for (NSUInteger i = 0; i < width * height ; i ++) { 
    NSUInteger red = rawData[i] ; 
    if (red > 230) { 
     rawData[i+1] = 0 ; 
     rawData[i+2] = 0 ; 
    } 
} 
Смежные вопросы