2013-07-18 3 views
2

이제 디스크에서 이미지를 읽습니다. 이미지는 그레이 스케일 이미지 또는 바이너리 이미지 일 수 있습니다. 그러나 나는 이미지의 헤더 파일에서 알 수 없다. 지금 내가하고있는 일은 고유 한 픽셀 수를 알려주는 것입니다. 고유 픽셀 수가 2보다 크면 이미지는 회색조입니다. 그렇지 않으면 흑백 이미지입니다. 다음 기능을 사용하여 작업을 수행합니다.배열 또는 이미지의 고유 값 번호

bool is_binary_image( std::vector<unsigned char> &memory) 
{ 
    std::set<unsigned char> myset; 
    for( std::vector<unsigned char>::iterator it = memory.begin(); 
     it!= memory.end(); 
     it++) 
    { 
     myset.insert(*it); 
     if (myset.size()>2) 
      return false; 
    } 

    return true; 

} 

이 기능은 후보 이미지가 회색조 이미지 인 경우 잘 수행 할 수 있습니다. 그러나, 후보 이미지가 이진이면, 그 함수는 시간 소모적이다. 기능 개선에 대한 아이디어가 있습니까?

+0

세 개의 별개 값을 찾을 때까지 반복합니다. – jrok

+3

@jrok, 그가하는 일이 아닌가요? –

+0

이진 이미지의 값을 항상 동일하게 사용할 수 있습니까? 예 : 0xff와 0x00? – ogni42

답변

5

당신이지도 대신 배열을 사용하여 속도를 높일 수 :

bool is_binary_image( std::vector<unsigned char> &memory) 
{ 
    int counter = 0; 
    int pixels[256] = {}; 

    for( std::vector<unsigned char>::iterator it = memory.begin(); 
     it!= memory.end(); 
     it++) 
    { 
     pixels[*it]++; 
     if (pixels[*it]==1) 
      counter++; 
     if (counter>2) 
      return false; 
    } 
    return true; 
} 

EDIT 여기

와는 들으 TemplateRex, 최적화 된 버전 (하지만 아마도 덜 읽을 수)된다

bool is_binary_image( std::vector<unsigned char> &memory) 
{ 
    int counter = 0; 
    int pixels[256] = {}; 

    for( std::vector<unsigned char>::iterator it = memory.begin(); 
     it!= memory.end(); 
     it++) 
    { 
     if ((counter += (++pixels[*it] == 1))>2) 
      return false; 
    } 
    return true; 
} 
+0

픽셀이 걸릴 수있는 값의 수는 256입니다. – TemplateRex

+0

왜 흥미로운 값이 2/3을 초과하지 않을 때 이러한 큰 배열이 필요한가? –

+0

당신은 선험적으로 어떤 것을 알고 있습니까? unsigned char에는 256 가지 가능한 값이 있으며, 각각은 언제나 나타날 수 있습니다. – gawi

1

첫 번째 픽셀을 가져옵니다. 그런 다음 첫 번째 픽셀과 같지 않은 다음 픽셀을 검색합니다. 이제는 두 가지가 아닌 픽셀을 검색합니다. 만약 당신이 끝까지 되돌아 가면, 그것은 이진 이미지입니다.

+0

아니요, 시작 부분에 완전히 흰색 선이 그어진 다음 회색 선으로 회색 선이 그어져 있고 회색으로 표시된 이미지가있는 경우이 기능이 작동하지 않습니다. – ogni42

+0

왜 작동하지 않습니까? –

+2

이렇게하면 효과는 있지만 뒤로 검색 할 필요가 없습니다. 두 번째 픽셀의 위치에서 이미지의 끝까지 계속 간단하게 진행하십시오. – zennehoy

1

이미지에 대한 어떤 가정도하지 않고 전체 이미지를 반복하는 한 실제로 할 수있는 작업은 많지 않습니다. 최악의 경우, 이미지에서 마지막으로 확인한 픽셀은 세 번째 값이므로 그레이 스케일 이미지가 아닌 것으로 확신하도록 모든 픽셀을 검사해야합니다.

그건 그렇고, 당신이 그것에 대해하는 방법은 상당히 비효율적이라고 말했습니다. 흑백 픽셀의 가능한 값을 알고있는 경우 픽셀을 반복하고 값이 흑백과 다른지 확인할 수 있습니다. 그러면 세트가 제거되고 성능이 크게 향상됩니다.