在iOS中使用CIEdgeWork Filters

时间:2012-08-05 22:15:57

标签: ios core-image

我正在使用Core Image过滤器并尝试制作CIEdgeWork过滤器。应用滤镜后,图像变黑。我正确地初始化CIFilter。

 CIFilter *edgeWork = [CIFilter filterWithName:@"CIEdgeWork"
                                       keysAndValues:kCIInputImageKey,filterPreviewImage,
                             @"inputRadius",[NSNumber numberWithFloat:3.0],
                             nil];

2 个答案:

答案 0 :(得分:3)

从iOS 5.x开始,CIEdgeWork是not available in Core Image on iOS,因此在尝试使用黑色图像时,您会发现黑色图像并不奇怪。

但是,您可以使用我的GPUImage框架中的GPUImageSketchFilter或GPUImageThresholdEdgeDetection来实现相同的效果。您可以在this answer中查看第一个过滤器的结果。后一种过滤器可能更接近Apple通过CIEdgeWork提供的实际效果,因为它们似乎将得到的边缘检测图像二值化。

答案 1 :(得分:1)

现在CIEdgeWork和CILineOverlay可用于iOS9

CIEdgeWork

您还可以使用基于GPUImageSketchFilter的CoreImage过滤器Sobel Sketch。 FWKSketchFilter

它的核心:

kernel vec4 sketch(sampler image, float strength){
vec2 d = destCoord();

vec2 bottomLeftTextureCoordinate = samplerTransform(image, d + vec2(-1.0, -1.0));
vec2 topRightTextureCoordinate = samplerTransform(image, d + vec2(1.0, 1.0));
vec2 topLeftTextureCoordinate = samplerTransform(image, d + vec2(-1.0, 1.0));
vec2 bottomRightTextureCoordinate = samplerTransform(image, d + vec2(1.0, -1.0));

vec2 leftTextureCoordinate = samplerTransform(image, d + vec2(-1.0, 0.0));
vec2 rightTextureCoordinate = samplerTransform(image, d + vec2(1.0, 0.0));
vec2 bottomTextureCoordinate = samplerTransform(image, d + vec2(0.0, -1.0));
vec2 topTextureCoordinate = samplerTransform(image, d + vec2(0.0, 1.0));

float bottomLeftIntensity = sample(image, bottomLeftTextureCoordinate).r;
float topRightIntensity = sample(image, topRightTextureCoordinate).r;
float topLeftIntensity = sample(image, topLeftTextureCoordinate).r;
float bottomRightIntensity = sample(image, bottomRightTextureCoordinate).r;

float leftIntensity = sample(image, leftTextureCoordinate).r;
float rightIntensity = sample(image, rightTextureCoordinate).r;
float bottomIntensity = sample(image, bottomTextureCoordinate).r;
float topIntensity = sample(image, topTextureCoordinate).r;

float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity;
float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity;

float mag = 1.0 - (length(vec2(h, v))*strength);

return vec4(vec3(mag), 1.0);}