3

FITS 画像を読み取るアプリケーションを作成しようとしています。FITS は Flexible Image Transport format の略で、主に天体物理学に関連する科学データを保存するために使用され、CCD カメラで空の写真を撮るほとんどのアマチュア天文学者によって使用されることが望まれるフォーマットです。したがって、FITSファイルには画像が含まれていますが、テーブルやその他の種類のデータも含まれている場合があります。私は Objectiv-C と cocoa プログラミングは初めてなので (このプロジェクトを開始したのは 1 年前ですが、忙しいので 1 年間はほとんど触れませんでした!)、ファイルの画像コンテンツを NSImageRep に渡します。FITS 画像のバイナリ データは、8 ビット/ピクセル、16 ビット/ピクセル、32 ビット/ピクセルの符号なし整数、または 32 ビット/ピクセル、64 ビット/ピクセルの浮動小数点で、すべてビッグ エンディアンです。

グレースケール FITS 画像の画像表現を 16 ビット/ピックス、32 ビット/ピックスの符号なし整数で表現することができましたが、32 ビット/ピックスの浮動小数点を探しているときに非常に奇妙な動作が発生します (この問題は RGB 32 ビットの価値があります)。 /pix 浮動小数点)。これまでのところ、8 ビット/ピクセルの整数データと、16 ビット/ピクセルおよび 32 ビット/ピクセルの整数データに基づく RGB イメージについてはテストしていません。これは、Web 上でサンプル ファイルをまだ見つけていないためです。

次のように、ファイルに適合するグレースケール画像フォームを作成する私のコードは次のとおりです。

-(void) ConstructImgGreyScale
{
CGBitmapInfo     bitmapInfo;
int bytesPerRow;

switch ([self BITPIX])   // BITPIX : Number bits/pixel. Information extracted from the FITS header
{
    case 8:
        bytesPerRow=sizeof(int8_t);
        bitmapInfo = kCGImageAlphaNone ;
        break;
    case 16:
        bytesPerRow=sizeof(int16_t);
        bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrder16Big;
        break;
    case 32:
        bytesPerRow=sizeof(int32_t);
        bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrder32Big;
        break;
    case 64:
        bytesPerRow=sizeof(int64_t);
        bitmapInfo = kCGImageAlphaNone;
        break;
    case -32:
        bytesPerRow=sizeof(Float32);
        bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrder32Big  | kCGBitmapFloatComponents;
    case -64:
        bytesPerRow=sizeof(Float64);
        bitmapInfo = kCGImageAlphaNone  | kCGBitmapFloatComponents;
        break;
    default:
        NSLog(@"Unknown pixel bit size");
        return;
}
[self setBitsPerSample:abs([self BITPIX])];

[self setColorSpaceName:NSCalibratedWhiteColorSpace];

[self setPixelsWide:[self NAXESofAxis:0]]; // <- Size of the X axis. Extracted from FITS header
[self setPixelsHigh:[self NAXESofAxis:1]]; // <- Size of the Y axis. Extracted from FITS header

[self setSize:  NSMakeSize( 2*[self pixelsWide], 2*[self pixelsHigh])];

[self setAlpha: NO];
[self setOpaque:NO];

CGDataProviderRef provider=CGDataProviderCreateWithCFData ((CFDataRef) Img);

CGFloat Scale[2]={0,28};
image = CGImageCreate ([self pixelsWide],
                       [self pixelsHigh],
                       [self bitsPerSample],
                       [self bitsPerSample],
                       [self pixelsWide]*bytesPerRow,
                       [[NSColorSpace deviceGrayColorSpace] CGColorSpace],
                       bitmapInfo,
                       provider,
                       NULL,
                       NO,
                       kCGRenderingIntentDefault
                       );

CGDataProviderRelease(provider);
return;
}  

そして、ここに 32/bits/pix 浮動小数点データの結果のスナップショットがあります: NASA HST 画像!

画像は左にシフトしているようですが、さらに厄介なのは、同じフレームに同じ画像 (フレームの上部と下部) の 2 つの表現が表示されることです。

また、他のファイルの場合、動作はより奇妙です: Star Field 1、(他のリンクについては、コメントを参照してください。新しいユーザーとして、このテキストに2つ以上のリンクを含めることはできません。また、直接配置することもできません画像。)

3 つのスター フィールドの画像はすべて、同じ Fits ファイルの内容を表しています。フレームの下部で画像の正しい表現を取得します (星は彩度が高すぎますが、まだエンコードを行っていません)。しかし、上部では、同じファイルを開くたびに、異なる表現の画像が得られました。このファイルを開くたびに、同じバイトシーケンスをタックして画像表現を生成しないように見えます(少なくとも上部については)。

また、下に複製された画像がデータの半分と上に半分のデータが含まれているのか、それとも単なるデータのコピーなのかはわかりません。

データの内容をプリミティブ形式 (人間が読める数値) に変換すると、その数値は適切な位置にあるピクセル内の数値と互換性があります。これにより、問題はデータに起因するのではなく、CGImage がデータを解釈する方法に起因すると考えられます。つまり、CGImageCreate 関数に渡す引数のどこかが間違っています。

RGB フィット画像データの場合、最後に 18 枚の画像をフレームに取り込みます。R、G、B各画像6枚ずつ。すべてグレースケールです。RGB 画像の場合、私のコードは異なることに注意してください。

私は何を間違っていますか?

4

1 に答える 1

1

わかりました、画像の複製に関して、私の問題の解決策をようやく見つけました。そして、これは非常にばかげた間違いであり、以前に見つけられなかったことを誇りに思っていません.

コードでは、 の を忘れてbreakcase -32ます。それでも、写真のシフトについては疑問が残ります。32 ビット整数イメージを開いているときにシフトは見られませんが、32 ビット浮動小数点データには表示されます。

このシフトが私のコードのどこから来るのか、誰にも分かりますか? それは私がイメージを構築する方法によるものですか?それとも、私がイメージを描く方法に起因している可能性がありますか?

以下は、画像を描画するために使用するコードです。最初は画像が上下逆だったので、少しコーディネートを変えてみました。

- (bool)draw {
CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
if (!context || !image) {
    return NO;
}
NSSize size = [self size];

CGContextTranslateCTM(context, 0, size.height);
CGContextScaleCTM(context, 1, -1);

CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), image);
return YES;
}
于 2011-12-07T21:00:57.230 に答える