Viele Lösungen im Internet erstellen Graustufenwerte. Es gibt keine Notwendigkeit für Filter. Wenn Sie eine solche benötigen als die Verwendung Code wie
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGImageRef greyImage = CGImageCreateCopyWithColorSpace(backingImage, colorSpace);
CGColorSpaceRelease(colorSpace);
Proper Schwellwertfilter folgt: inputThreshold Float-Wert von 0.0f sein kann 0,5f
https://gist.github.com/xhruso00/a3f8a9c8ae7e33b8b23d
Detaillierte Rezept kann bei https://developer.apple.com/library/ios/documentation/graphicsimaging/Conceptual/CoreImaging/ci_custom_filters/ci_custom_filters.html#//apple_ref/doc/uid/TP30001185-CH6-CJBEDHHH
finden
#import "BlackAndWhiteThresholdFilter.h"
@interface BlackAndWhiteThresholdFilter()
{
CIKernel *_kernel;
}
@end
@implementation BlackAndWhiteThresholdFilter {
NSNumber *inputThreshold;
CIImage *inputImage;
}
//more https://developer.apple.com/library/ios/documentation/graphicsimaging/Conceptual/CoreImaging/ci_image_units/ci_image_units.html#//apple_ref/doc/uid/TP30001185-CH7-SW8
+ (void)registerFilter
{
NSDictionary *attributes = @{
kCIAttributeFilterCategories: @[
kCICategoryVideo,
kCICategoryStillImage,
kCICategoryCompositeOperation,
kCICategoryInterlaced,
kCICategoryNonSquarePixels
],
kCIAttributeFilterDisplayName: @"Black & White Threshold",
};
[CIFilter registerFilterName:@"BlackAndWhiteThreshold"
constructor:(id <CIFilterConstructor>)self
classAttributes:attributes];
}
+ (CIFilter *)filterWithName:(NSString *)aName
{
CIFilter *filter;
filter = [[self alloc] init];
return filter;
}
- (instancetype)init {
self = [super init];
if (self) {
NSString *kernelText = @"kernel vec4 thresholdKernel(sampler image, float inputThreshold)\n"
"{\n"
" float pass = 1.0;\n"
" float fail = 0.0;\n"
" const vec4 vec_Y = vec4(0.299, 0.587, 0.114, 0.0);\n"
" vec4 src = unpremultiply(sample(image, samplerCoord(image)));\n"
" float Y = dot(src, vec_Y);\n"
" src.rgb = vec3(compare(Y - inputThreshold, fail, pass));\n"
" return premultiply(src);\n"
"}";
_kernel = [[CIKernel kernelsWithString:kernelText] objectAtIndex:0];
}
return self;
}
- (NSArray *)inputKeys {
return @[@"inputImage",@"inputThreshold"];
}
- (NSArray *)outputKeys {
return @[@"outputImage"];
}
- (NSDictionary *)customAttributes
{
NSDictionary *thresholDictionary = @{
kCIAttributeType: kCIAttributeTypeScalar,
kCIAttributeMin: @0.0f,
kCIAttributeMax: @1.0f,
kCIAttributeIdentity : @0.00,
kCIAttributeDefault: @0.5f,
};
return @{
@"inputThreshold": thresholDictionary,
// This is needed because the filter is registered under a different name than the class.
kCIAttributeFilterName : @"BlackAndWhiteThreshold"
};
}
- (CIImage *)outputImage {
if (inputImage == nil) {
return nil;
}
CISampler *sampler;
sampler = [CISampler samplerWithImage:inputImage];
NSArray * outputExtent = [NSArray arrayWithObjects:
[NSNumber numberWithInt:[inputImage extent].origin.x],
[NSNumber numberWithInt:[inputImage extent].origin.y],
[NSNumber numberWithFloat:[inputImage extent].size.width],
[NSNumber numberWithFloat:[inputImage extent].size.height],nil];
CIImage *outputImage = [self apply: _kernel,
sampler,
inputThreshold,
kCIApplyOptionExtent, outputExtent,
kCIApplyOptionDefinition, [sampler definition],
nil];
return outputImage;
}
@end
Aktualisiert mit einem visuellen Unterschied zwischen schwarz & wh ite (links) und Graustufen (rechts)
Wie über einen Link zum separaten Thread über die Kernel-Routine? – JWWalker
Hier ist ein Link zu dem anderen Thread: http://StackOverflow.com/Questions/2963218/Applying-Transformations-To-nSbitmapImagerep Folgen Sie dem Hyperlink hinter "Schwellenwertfilter" – Adam
Quartz Composer ist ein großartiger Ort, um mit Core Image zu experimentieren Filter. Ich habe es benutzt, um den durch die Verbindung gegebenen Schwellenwertfilter zu testen. Es gab einen Kompilierungsfehler, verursacht durch etwas, das wie ein Minuszeichen aussah, aber tatsächlich ein Bindestrich war. Sobald ich das behoben hatte, funktionierte es. – JWWalker