7

2 つの画像の違いを検出し、両方の画像に共通する領域を処理するために異なる領域のマスクを作成するにはどうすればよいですか (ガウスぼかしなど)。

スケッチ

編集:現在、このコードを使用してピクセルの RGBA 値を取得しています:

+ (NSArray*)getRGBAsFromImage:(UIImage*)image atX:(int)xx andY:(int)yy count:(int)count
{
    NSMutableArray *result = [NSMutableArray arrayWithCapacity:count];

    // First get the image into your data buffer
    CGImageRef imageRef = [image CGImage];
    NSUInteger width = CGImageGetWidth(imageRef);
    NSUInteger height = CGImageGetHeight(imageRef);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    unsigned char *rawData = malloc(height * width * 4);
    NSUInteger bytesPerPixel = 4;
    NSUInteger bytesPerRow = bytesPerPixel * width;
    NSUInteger bitsPerComponent = 8;
    CGContextRef context = CGBitmapContextCreate(rawData, width, height,
                    bitsPerComponent, bytesPerRow, colorSpace,
                    kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
    CGContextRelease(context);

    // Now your rawData contains the image data in the RGBA8888 pixel format.
    int byteIndex = (bytesPerRow * yy) + xx * bytesPerPixel;
    for (int ii = 0 ; ii < count ; ++ii)
    {
        CGFloat red   = (rawData[byteIndex]     * 1.0) / 255.0;
        CGFloat green = (rawData[byteIndex + 1] * 1.0) / 255.0;
        CGFloat blue  = (rawData[byteIndex + 2] * 1.0) / 255.0;
        CGFloat alpha = (rawData[byteIndex + 3] * 1.0) / 255.0;
        byteIndex += 4;

        UIColor *acolor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
        [result addObject:acolor];
    }

  free(rawData);

  return result;
}

問題は、画像が iPhone のカメラからキャプチャされているため、正確に同じ位置にないことです。いくつかのピクセルの領域を作成し、その領域の一般的な色を抽出する必要があります (おそらく、RGBA 値を合計してピクセル数で割ることによりますか?)。これをどうやってCGMaskに変換できますか?

これは複雑な質問であることを知っているので、助けていただければ幸いです。

ありがとう。

4

5 に答える 5

6

これを行う最も簡単な方法は、差分ブレンド モードを使用することだと思います。次のコードは、私がCKImageAdditionsで使用するコードに基づいています。

+ (UIImage *) differenceOfImage:(UIImage *)top withImage:(UIImage *)bottom {
    CGImageRef topRef = [top CGImage];
    CGImageRef bottomRef = [bottom CGImage];

    // Dimensions
    CGRect bottomFrame = CGRectMake(0, 0, CGImageGetWidth(bottomRef), CGImageGetHeight(bottomRef));
    CGRect topFrame = CGRectMake(0, 0, CGImageGetWidth(topRef), CGImageGetHeight(topRef));
    CGRect renderFrame = CGRectIntegral(CGRectUnion(bottomFrame, topFrame));

    // Create context
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    if(colorSpace == NULL) {
        printf("Error allocating color space.\n");
        return NULL;
    }

    CGContextRef context = CGBitmapContextCreate(NULL,
                                                 renderFrame.size.width,
                                                 renderFrame.size.height,
                                                 8,
                                                 renderFrame.size.width * 4,
                                                 colorSpace,
                                                 kCGImageAlphaPremultipliedLast);
    CGColorSpaceRelease(colorSpace);

    if(context == NULL) {
        printf("Context not created!\n");
        return NULL;
    }

    // Draw images
    CGContextSetBlendMode(context, kCGBlendModeNormal);
    CGContextDrawImage(context, CGRectOffset(bottomFrame, -renderFrame.origin.x, -renderFrame.origin.y), bottomRef);
    CGContextSetBlendMode(context, kCGBlendModeDifference);
    CGContextDrawImage(context, CGRectOffset(topFrame, -renderFrame.origin.x, -renderFrame.origin.y), topRef);

    // Create image from context
    CGImageRef imageRef = CGBitmapContextCreateImage(context);
    UIImage * image = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);

    CGContextRelease(context);

    return image;
}
于 2010-10-17T03:28:32.410 に答える
2

1 つの iPhone の写真から次の iPhone の写真へのピクセルの変化、被写体の変化、iPhone の移動、およびランダム ノイズの 3 つの理由があります。この質問では、あなたは主題の変更に最も関心があり、他の 2 つの変更の影響を処理したいと考えていると思います。また、このアプリはユーザーが iPhone を適度に動かないようにすることを意図しているので、iPhone の動きの変化は被写体の変化ほど重要ではないと思います。

ランダム ノイズの影響を軽減するには、画像を少しぼかします。結果の画像の各ピクセルが元のピクセルと最も近いピクセルの平均である単純な平均化ぼかしは、適度に明るい iPhone 画像のノイズを滑らかにするのに十分なはずです。

iPhone の動きに対処するために、各画像に対して特徴検出アルゴリズムを実行できます (まずはウィキペディアで特徴検出を調べてください)。次に、最も変化の少ない検出された特徴を整列させるために必要な変換を計算します。

その変換をぼやけた画像に適用し、画像間の違いを見つけます。十分な差があるピクセルはマスクになります。その後、マスクを処理して、変更されたピクセルの島を取り除くことができます。例えば、被験者は無地のシャツを着ているかもしれません。被写体はある画像から次の画像に移動する可能性がありますが、無地のシャツの領域が重なって、中央に穴のあるマスクになる場合があります。

つまり、これは重要かつ困難な画像処理の問題です。stackoverflow.com の投稿に答えはありません。デジタル画像処理の教科書に答えがあります。

于 2010-10-19T13:42:01.370 に答える
0

画像からピクセル値を差し引いて、差が0のピクセルを処理することはできませんか?

于 2010-10-12T08:33:28.307 に答える
0

特定の半径内の他の画像に適切に類似したピクセルを持たないすべてのピクセルは、マスクの一部と見なすことができます。遅いですが (より高速なものはほとんどありません)、かなり単純に動作します。

于 2010-10-13T21:21:21.807 に答える
-1

ピクセルを調べて、下の画像で異なるものを新しいもの (不透明ではない) にコピーします。

上のものを完全にぼかしてから、新しいものを上に表示します。

于 2010-10-13T10:18:37.290 に答える