2013-02-10 76 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和地图走绿色和蓝色值。 – 2013-02-10 07:24:47

+0

对于当前标准,这是非常低的简单处理量,并且由于您必须访问每个像素才能完成您之后的过滤,这几乎是任务的复杂性(线性)。这意味着你只能通过使用一些能让事情变得更智能的库来获得持续的因素改善。但是,除此之外,除了这是一个简单的应用程序,在RGB中区分颜色可能会产生不好的结果。相反,您应该检查为单色通道提供色彩的色彩空间,如HSB和其他色彩空间。 – mmgp 2013-02-10 13:03:56

回答

0

您可以开始优化您的代码。这里有很多不必要的操作和浮点/整数转换。

for (NSUInteger i = 0; i < width * height ; i ++) { 
    NSUInteger red = rawData[i] ; 
    if (red > 230) { 
     rawData[i+1] = 0 ; 
     rawData[i+2] = 0 ; 
    } 
}