FC2ブログ

頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


macOSで画像の輝度データを得る

機械学習のMNISTをmacOSのMetal Performance Shader使ってやろうとしているのだけど、png画像からデータを取り出すのに苦労した。

28x28サイズの画像

↑MNISTで使われる28x28でアルファチャンネルのないpng画像。
ここから輝度を28x28個取り出したい。

最初、iOSで使ってたコードを持ってきてUIImageをNSImageに書き換えるなどしたら警告もなくなったので動かしてみたもののちゃんと動かず、よくよく調べると画像からデータが全く取得できていなかった。
{
     [imageView.layer renderInContext:context];
}
↑iOSの場合だとこのようにしてたが、、、
cocoa - Get pixels and colours from NSImage - Stack Overflow
↑こちらによると、NSGraphicsContextでラップするとええよ、とあるので参考にして書き換えた。
それがこんな感じ↓
{
    NSImage *image = [NSImage imageNamed:@"0002.png"];

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    CGImageAlphaInfo bitmapInfo = kCGImageAlphaNone;
    
    CGContextRef context = CGBitmapContextCreate(nil, 28,28, 8, 28,
                                                 colorSpace,
                                                 bitmapInfo);

    NSRect imageRect = NSMakeRect(0, 0, 28,28);
    NSGraphicsContext *gctx = [NSGraphicsContext graphicsContextWithCGContext:context flipped:NO];
    [NSGraphicsContext setCurrentContext:gctx];
    [image drawInRect:imageRect];

    void *data = CGBitmapContextGetData (context);



    [srcImage.texture replaceRegion:srcImageRegion
                                  mipmapLevel:0
                                        slice:0
                                    withBytes:data
                                  bytesPerRow:28
                                bytesPerImage:0];
}
srcImageはMPSImageオブジェクト。最後のメソッドでデータをMPSImageに書き込んでる。


dataの中身を直接覗いて確認する↓
{
    unsigned char *lumi = (unsigned char *)data;
    for(NSUInteger y=0;y<28;y++) {
        NSString *line = @"";
        for (NSUInteger x=0;x<28;x++) {
            NSUInteger ite= 28*y+x;
            line = [line stringByAppendingFormat:@"%d ",lumi[ite]];
            //NSString *str = (lumi[ite] > 1) ? @"1" : @"0";
            //line = [line stringByAppendingFormat:@"%@",str];
        }
        NSLog(@"%@",line);
    }
}
輝度を表示

↑dataの中身をそのまま表示(右端は少しカットしてる)。

輝度を整列して表示

↑1と0で見やすくした場合。
下はNNで予測した結果(2であろうという確率が一番高くなってる)。

<< SceneKitでオブジェクト表面に背景画像を表示する  TopPage  KerasでCNNを使ったMNIST >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1208-b1ad9091




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad