안녕하세요 여러분 : 저는 사진을 찍고 그 팔레트를 분석하는 주요 색상을 가져오고 싶습니다. (이 방법이 가장 쉬운 방법이라고 생각합니다.)하지만 어디서부터 시작해야할지 몰라요.iPhone 컨텍스트 : 이미지에서 팔레트 정보를 어떻게 추출합니까?
답변
당신은 원시 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 노드에 추가하고, 전체 배열을 반복하여 목록을 찾을 필요가 없습니다. 지우는 것.
수를 계산할 때 왜 연결 목록을 사용합니까? http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSCountedSet_Class/Reference/Reference.html – kennytm
"기본 색상"? 가장 많이 사용되는 하나의 RGB 값을 의미합니까? 당신은 모든 색깔을 평균화하고 싶지 않습니까? 이미지의 형식은 무엇입니까? 그냥 원시 RGB입니까? – matt