2013-02-10 38 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 ; 
    } 
}