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;
}
미리 도움을 주셔서 감사합니다.