2014-10-28 3 views
5

ich ciimage auf monochrome Umwandlung mit CICrop clipping und Sobel-Kantenleisten zu erfassen, # if Abschnitt an der Unterseite ist verwendet Ergebnis anzuzeigenCIImage (IOS): Hinzufügen von 3x3 Faltung nach einem monochromen Farbe Filter wieder irgendwie

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 

Nun, wenn 3x3 Faltung ist nicht Teil der ciimage Pipeline der Teil des Bildes ausführen I Kantendetektion auf erscheint grau, aber wenn CIConvolution3X3 Postfix ist Teil der Verarbeitungspipeline die Farben auf magische zurück erscheinen. Dies geschieht unabhängig von , wenn ich CIColorMonochrome oder CIPhotoEffectMono-Präfix verwenden, um Farbe zu entfernen. Irgendwelche Ideen, wie man die Farbe bis ganz nach unten in der Pipeline hält? tnx

UPD: überraschenderweise nicht ein rohes benutzerdefinierte monochrome Kernel wie diese

laufen
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; 
} 

statt Standard Mono-Filter von Apfel Ergebnisse in der exakt gleichen Problem mit der Farbe der Verwendung zurück, wenn 3x3 Faltung kommt ist Teil meiner Ci-Pipeline

Antwort

4

Dieses Problem ist, dass CI-Convolutions-Operationen (z. B. CIConvolution3X3, CIConvolution5X5 und CIGaussianBlur) auf allen vier Kanälen des Eingabebildes arbeiten. Dies bedeutet, dass der resultierende Alphakanal in Ihrem Codebeispiel 0,5 ist, wo Sie wahrscheinlich möchten, dass er 1,0 ist. Versuchen Sie, einen einfachen Kernel nach der Faltung hinzuzufügen, um den Alpha wieder auf 1 zu setzen.

+0

Sieht vielversprechend aus. – Bobjt

2

zu folgen: Ich habe Coreimage für diese Aufgabe aufgegeben. Es scheint, dass die Verwendung von zwei Instanzen von CIFilter oder CIKernel einen Konflikt verursacht. Jemand irgendwo in der coreimage Innereien scheint gles Zustand falsch zu manipulieren und, so, Reverse Engineering, was falsch gelaufen endet teurer als mit etwas anderes als Core-Image (mit benutzerdefinierten Ci-Filter, die nur auf ios8 arbeiten) gpuimage scheint nicht so fehlerhaft und leichter zu warten/zu debuggen (keine Zugehörigkeit meinerseits)

+0

Scheint wie ein ernsthafter Fehler. [Haben Sie es mit Apple eingereicht?] (Http://bugreport.apple.com) – rickster

+0

nicht. Ich habe es nicht eingereicht (ich habe 3 Bugs drin, von denen 2 von Apple prompt ignoriert werden). Sie können es gerne ablegen. –

Verwandte Themen