2014-10-28 1 views
5

I는 하단 부분의 #if, CICrop 클리핑 및 에지를 검출하기 위해 소벨 실행 단색으로 ciimage 변환있어이 가CIImage (IOS)는 : × 3 회선 추가 단색 필터 든 색

결과 표시하는 데 사용되는 복원 후
CIImage *ci = [[CIImage alloc] initWithCGImage:uiImage.CGImage]; 

CIImage *gray = [CIFilter filterWithName:@"CIColorMonochrome" keysAndValues: 
     @"inputImage", ci, @"inputColor", [[CIColor alloc] initWithColor:[UIColor whiteColor]], 
     nil].outputImage; 



CGRect rect = [ci extent]; 
rect.origin = CGPointZero; 

CGRect cropRectLeft = CGRectMake(0, 0, rect.size.width * 0.2, rect.size.height); 
CIVector *cropRect = [CIVector vectorWithX:rect.origin.x Y:rect.origin.y Z:rect.size.width* 0.2 W:rect.size.height]; 
CIImage *left = [gray imageByCroppingToRect:cropRectLeft]; 

CIFilter *cropFilter = [CIFilter filterWithName:@"CICrop"]; 

[cropFilter setValue:left forKey:@"inputImage"]; 
[cropFilter setValue:cropRect forKey:@"inputRectangle"]; 

// The sobel convoloution will produce an image that is 0.5,0.5,0.5,0.5 whereever the image is flat 
// On edges the image will contain values that deviate from that based on the strength and 
// direction of the edge 
const double g = 1.; 
const CGFloat weights[] = { 1*g, 0, -1*g, 
    2*g, 0, -2*g, 
    1*g, 0, -1*g}; 
left = [CIFilter filterWithName:@"CIConvolution3X3" keysAndValues: 
     @"inputImage", cropFilter.outputImage, 
     @"inputWeights", [CIVector vectorWithValues:weights count:9], 
     @"inputBias", @0.5, 
     nil].outputImage; 

#define VISUALHELP 1 
#if VISUALHELP 
CGImageRef imageRefLeft = [gcicontext createCGImage:left fromRect:cropRectLeft]; 
CGContextDrawImage(context, cropRectLeft, imageRefLeft); 
CGImageRelease(imageRefLeft); 
#endif 

지금 × 3 회선은 ciimage 파이프 이미지 부분의 일부가 될 때마다 I 쇼 최대 회색 에지 검출을 실행 하지만 CIConvolution3X3 접미사가 색 마술 위로 나타나는 처리 파이프 라인 의 부분마다. 이것은 색을 제거하기 위해 CIColorMonochrome 또는 CIPhotoEffectMono 접두사를 사용하는 경우 과 상관없이 발생합니다. 파이프 라인의 맨 아래까지 색상을 유지하는 방법에 대한 아이디어가 있으십니까? TNX

UPD : 놀라 울 등이 하나 개

kernel vec4 gray(sampler image) 
{ 
    vec4 s = sample(image, samplerCoord(image)); 
    float r = (s.r * .299 + s.g * .587 + s.b * 0.114) * s.a; 
    s = vec4(r, r, r, 1); 
    return s; 
} 

대신 돌아 오는 색상과 동일한 문제에 사과 결과에서 표준 모노 필터를 사용하는 경우 3 × 3 회선으로 원유 정의 흑백 커널을 실행하지 내 CS 파이프 라인의 일부입니다.

답변

4

이 문제는 CI 컨볼 루션 작업 (예 : CIConvolution3X3, CIConvolution5X5 및 CIGaussianBlur)이 입력 이미지의 4 개 채널 모두에서 작동한다는 점입니다. 즉, 코드 예제에서 결과 알파 채널은 1.0이되도록 0.5이됩니다. 컨볼 루션 후 간단한 커널을 추가하여 알파를 다시 1로 설정하십시오.

+0

유망 해 보인다. – Bobjt

2

후속 조치 : 저는이 작업을 위해 coreimage를 포기했습니다. CIFilter 또는 CIKernel의 두 인스턴스를 사용하면 충돌이 발생할 수 있습니다. 어쨌든 코어 이미지 내부에있는 누군가가 잘못하여 gles 상태를 조작하는 것처럼 보입니다. 따라서 잘못 처리 된 항목을 리버스 엔지니어링하면 핵심 이미지 이외의 다른 것을 사용하는 것보다 비용이 많이 드는 경우가 있습니다 (어쨌든 ios8에서만 작동하는 사용자 정의 ci 필터 사용). gpuimage는 버그가없는 것 같습니다.

+0

심각한 버그처럼 보입니다. [Apple과 함께 제출하셨습니까?] (http://bugreport.apple.com) – rickster

+0

아니요. 나는 그것을 제출하지 않았다 (나는 3 개의 버그를 가지고 있는데 그 중 2 개는 애플에 의해 즉시 무시된다). 이 파일을 제출하실 수 있습니다. –