2010-02-10 5 views
0

안녕하세요 여러분 : 저는 사진을 찍고 그 팔레트를 분석하는 주요 색상을 가져오고 싶습니다. (이 방법이 가장 쉬운 방법이라고 생각합니다.)하지만 어디서부터 시작해야할지 몰라요.iPhone 컨텍스트 : 이미지에서 팔레트 정보를 어떻게 추출합니까?

+0

"기본 색상"? 가장 많이 사용되는 하나의 RGB 값을 의미합니까? 당신은 모든 색깔을 평균화하고 싶지 않습니까? 이미지의 형식은 무엇입니까? 그냥 원시 RGB입니까? – matt

답변

0

당신은 원시 24 비트 RGB 이미지가 있고 각 색상이 나타나는 횟수를 찾으려면 가정 :

가이 일을 정말이 간단한 방법은 다음과 같습니다

나의 마음에 드는는 만드는 것입니다 각각의 가능한 색상에 대한 int의 배열을 만든 다음 그 배열에 색인을 붙이면 ++는 64 meg의 메모리처럼 사용합니다.

또 다른 방법은 연결 목록을 만드는 것입니다. 새 색상이 발견 될 때마다 추가합니다. 목록에 저장된 구조체는 색상 및 발생 횟수를 저장합니다. 느린 모든 축적 작업을 수행 할 수 있습니다. 각 픽셀에 대한 전체 목록을 검색해야하지만 실제 사용되는 색상 만 목록에 포함되므로 작은 이미지에 더 적합합니다 (작은 이미지에도 이상적입니다).

나는 타협을 좋아합니다.

빨강과 초록색을 사용하면 링크 된 목록의 배열에 색인을 붙일 수 있습니다 (즉, 목록에 포인터를 저장한다고 가정하면 배열은 256k에 불과합니다). 검색 할 목록은 다음과 같이됩니다. 비교적 짧은 빨강, 녹색 색상의 유일한 파란색 변종 때문입니다. 당신이 단 하나의 가장 많이 사용되는 색상에만 관심이 있다면, 저는 이것을 "최대 색상"변수에 저장하고, 픽셀을 반복하고 색상을 증가시킬 때마다 비교할 것입니다. 그렇게하지 않아도됩니다. 끝 부분에서 가장 많이 사용되는 것을 검색하는 전체 구조를 살펴보십시오. 바로 그런 목록을 검색하는 것이 아니라,

struct Pixel 
{ 
    byte R,G,B; 
} 

const int noPixels = 1024*768; // this is whatever the number of pixels you have is 

Pixel pixels[noPixels]; // this is your raw array of pixels 

unsinged int mostUsedCount = 0; 
Pixel mostUsedColor; 

struct ColorNode 
{ 
    ColorNode* next; 
    unsigned int count; 
    byte B; 
} 

ColorNode* RG = new ColorNode[256*256]; 
memset(RG,0,sizeof(ColorNode)*256*256); 

for(int i = 0; i<noPixels; i++) 
{ 
    int idx = pixels[i].R + pixels[i].G*256; 
    ColorNode*t; 
    for(t=RG[idx]; t; t = t->next) 
    { 
     if(t->B == pixels[i].B) 
     { 
      break; 
     } 
    } 
    if(!t) 
    { 
     t = new ColorNode; 
     t->next = RG[idx]; 
     RG[idx] = t; 
     t->B = pixels[i].B; 
     t->count = 0; 
    } 

    t->count++; 
    if(t->count > mostUsedCount) 
    { 
     mostUsedCount = t->count; 
     mostUsedColor = pixels[i]; 
    } 
} 

당신은 이진 트리를 사용하는 것이 좋습니다, 또는 나무도 몇 가지. 하지만 나는 그 종류의 물건에 대해서 너무 지식이 없다 ...

오, 그래 ... 나는 기억 관리를 잊었다.

전체 배열을 살펴보고 삭제가 필요한 모든 노드를 삭제할 수는 있지만 지루할 수 있습니다.

가능한 경우 처음에 필요할 수있는 모든 메모리를 할당합니다. 즉, 256k + sizeof (ColorNode) * noPixels ~ = 256 + 원시 이미지 데이터 크기의 2 ~ 3 배가됩니다.

그런 식으로 간단한 스택 방법을 사용하여 노드를 끌어 와서 모든 파울 스윕을 삭제할 수 있습니다.

당신이 할 수있는 또 다른 일은 모든 할당 된 노드에 대한 다른 링크 목록에도 노드를 추가하는 것입니다. 반복 프로세스가 증가하고, 데이터를 Color 노드에 추가하고, 전체 배열을 반복하여 목록을 찾을 필요가 없습니다. 지우는 것.

+0

수를 계산할 때 왜 연결 목록을 사용합니까? http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSCountedSet_Class/Reference/Reference.html – kennytm