2013-03-20 3 views
6

CIAreaHistogram 코어 이미지 필터를 사용하는 응용 프로그램을 빌드하고 있습니다. 나는에 내가 다음 맞춤 커널 (게시물의 끝을 참조)를 통해 실행 히스토그램 자체에 대한 CIImage을받을 테스트를위한 10의 inputCount 값 (버킷 수)과 1CIAreaHistogram inputScale factor

inputScale 값을 사용 알파 값을 1로 설정합니다. 그렇지 않으면 히스토그램 계산의 알파 값이 미리 곱 해져서 NSBitmapImageRep으로 변환됩니다.

그런 다음 이미지 담당자의 버퍼를 스캔하여 RGB 값을 인쇄합니다 (알파 값 제외). 그러나이 작업을 수행하면 10을 가로 지르는 R, G 및 B 값의 합계가 최대 255까지 반드시 합치는 것은 아닙니다.

예를 들어 완전히 검은 이미지로 히스토그램을 적용한 다음 사용자 정의 내가 예상대로 모든 픽셀이 검은 색이기 때문에

RGB: 255 255 255 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 

이는, 그래서 모든 것을 첫 번째 버킷에 : 커널은 다음과 같은 출력을 얻을. - 그들은까지 추가하지 않는 255이 문제 때문에 발생

RGB: 98 76 81 
RGB: 164 97 87 
RGB: 136 161 69 
RGB: 100 156 135 
RGB: 80 85 185 
RGB: 43 34 45 
RGB: 31 19 8 
RGB: 19 7 3 
RGB: 12 5 2 
RGB: 16 11 11 

R, G, 및 B의 값을 추가 : 나는 컬러 이미지와 동일한 알고리즘을 실행하는 경우, 나는 다음과 같은 수 이 히스토그램 중 두 개를 비교해야하며 알고리즘에서 합계가 0에서 255 사이가 될 것으로 예상합니다.이 값을 분명히 확장 할 수는 있지만 성능상의 이유로 추가 단계를 피하려고합니다.

나는 왜 이것이 일어나고 있는지에 대한 단서를 줄 수있는 흥미로운 것을 발견했습니다. 내 사용자 정의 커널에서는 단순히 알파 값을 1로 설정했습니다. 모든 픽셀을 빨간색으로 설정하는 두 번째 커널 (포스트의 끝 부분을 보았습니다)을 시도했습니다. 분명히 녹색과 파란색 값은 0입니다. 그러나 비트 맵 담당자의 값을 확인할 때이 결과가 나타납니다.

RGB: 255 43 25 

하지만 G와 B를 0으로 설정했습니다. 이것은 색상 관리를 나타내는 문제의 일부인 것처럼 보입니다. I 명시 커널 값을 설정하지만 이후이 발생 될 수있는 코드의 한 블록도이다 - 필터로부터 CIImage에서 NSBitmapImageRep에 전환율

NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCIImage:kernelOutput]; 
unsigned char *buf = [bitmapRep bitmapData]; 

I는 255 RGB에 픽셀을 설정하면 0 0, 그런 다음 그 라인을 실행 한 다음 버퍼를 읽습니다. RGB 값은 모두 255입니다. 43 25. 전체 워크 플로우가 기반으로하는 원래 CGImageRef의 색상 공간을 kCGColorSpaceGenericRGB으로 설정하여 색상 프로파일이 들고 다니지 만 아무 소용이 없습니다.

누구나 CIFilter 커널이 이런 식으로 행동하는 이유와 해결 방법을 말할 수 있습니까?

앞서 언급했듯이 다음은 내가 사용하는 CIFilter 커널 기능의 복사본입니다. 우선, (1) 알파를 설정하는 것은 :

kernel vec4 adjustHistogram(sampler src) 
{ 
    vec4 pix = sample(src, destCoord()); 
    pix.a = 1.0; 
    return pix; 
} 

하고 다음으로, 모든 화소를 설정 한 255 0 0 RGB로하지만 NSBitmapImageRep로 변환되면 즉 255 43 25 끝낸다 :

kernel vec4 adjustHistogram(sampler src) 
{ 
    vec4 pix = sample(src, destCoord()); 
    pix.r = 1.0; pix.g = 0.0; pix.b = 0.0; 
    pix.a = 1.0; 
    return pix; 
} 

미리 도움을 주셔서 감사합니다.

답변

0

(새 CIImage 객체를 생성하거나 기존 하나를 교체 할 때마다 또는) 사용자 지정 코어 이미지 필터를 사용하는 경우에만 생성하고 히스토그램을 표시 한 줄의 코드가 필요합니다

return [CIFilter filterWithName:@"CIHistogramDisplayFilter" keysAndValues:kCIInputImageKey, self.inputImage, @"inputHeight", @100.0, @"inputHighLimit", @1.0, @"inputLowLimit", @0.0, nil].outputImage;