sto convertendo ciimage a monocromatica, con clipping CICrop e funzionante Sobel per rilevare bordi, #if sezione in fondo viene utilizzato provocareCIImage (IOS): Aggiunta 3x3 convoluzione dopo un filtro monocromatico ripristina qualche colore
per visualizzareCIImage *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
Ora ogni volta 3x3 convoluzione non fa parte del ciimage conduttura la porzione dell'immagine corro rilevamento dei bordi sulla presenta grigi, ma ogni volta CIConvolution3X3 postfix fa parte della pipeline di elaborazione i colori appaiono magicamente indietro. Questo succede non importa se uso il prefisso CIColorMonochrome o CIPhotoEffectMono per rimuovere il colore. Qualche idea su come mantenere il colore fino in fondo alla pipeline? tnx
UPD: non sorprendentemente esecuzione un kernel monocromatico grezzo personalizzato come questo
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;
}
invece di utilizzare filtri mono standard da risultati mela esattamente nello stesso problema con il colore ritorno quando 3x3 convoluzione fa parte del mio ci pipeline
Sembra promettente. – Bobjt