5

ciimage をモノクロに変換し、CICrop でクリッピングし、sobel を実行してエッジを検出しています。下部の #if セクションを使用して結果を表示しています

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

3x3 畳み込みが ciimage パイプラインの一部ではない場合は常に、エッジ検出を実行する画像の部分が灰色で表示されますが、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;
}

Apple の標準的なモノラル フィルターを使用する代わりに、3x3 畳み込みが ci パイプラインの一部である場合に色が戻ってくるというまったく同じ問題が発生します。

4

2 に答える 2

4

この問題は、CI 畳み込み演算 (CIConvolution3X3、CIConvolution5X5、CIGaussianBlur など) が入力画像の 4 つのチャネルすべてで動作することです。これは、コード例では、結果のアルファ チャネルが 0.5 になり、おそらく 1.0 になることを意味します。畳み込みの後に単純なカーネルを追加して、アルファを 1 に戻してみてください。

于 2015-01-25T21:11:31.957 に答える
2

フォローアップへ:このタスクのためにコアイメージをあきらめました。CIFilter または CIKernel の 2 つのインスタンスを使用すると競合が発生するようです。コアイメージの内部のどこかで誰かが gles の状態を誤って操作しているように見えるため、間違ったリバース エンジニアリングは、コア イメージ以外のものを使用するよりもコストがかかります (とにかく ios8 でのみ動作するカスタム ci フィルターを使用します) gpuimage はバグが多く簡単ではないようですサービス/デバッグへ (私の側では関係ありません)

于 2014-11-05T15:16:40.560 に答える