私は最初に、私が仕事を始めようとしている物理学者であることを警告したいと思います。私のC++知識は基本的に存在しません。BMPグレースケールヘッダーを追加する
私は現在GATEでCTスキャナのシミュレーションを行っています。出力をbmpファイルに変換する必要があります。
Gateは一連のfile_xxx.datを作成します。ここで、xxxは000から投影の数までの範囲で、それぞれに検出器の各ピクセルごとに1つの32bit floatの配列が含まれています。
グレースケールbmpヘッダーを追加して別のプログラムで再構築できるように、それぞれを1つずつ取る必要があります。このプロセスでは、ピクセルからの情報を失わないように32ビットの精度を維持したいので、可能であれば32ビットのグレースケールになります。
私はbmpヘッダーを動作させるために、Gateが持っている別の出力であるルートファイルを扱っています。私はむしろルートファイルの使用を避けたいのです。なぜなら、私は必要のない膨大な量の情報を処理しなければならず、処理が遅くなるからです。
私はこのコードの一部を書きました。コピー貼り付けしたものもあり、同僚が行ったものもあります。ほとんどの場合、ほとんど何をしているのか分かりません。
#include <iostream>
#include <fstream>
#include <ostream>
#include <cerrno>
#include <cstdlib>
#include <set>
#include <cmath>
#include "TApplication.h"
#include "TFile.h"
#include "TTree.h"
using namespace std;
#define MAX_ANGLES 180
#define PIXELS_X 100
#define PIXELS_Y 100
#define MAX_PIXELS 10000
struct SDataA
{
float A[MAX_ANGLES][MAX_PIXELS];
void Reset()
{
for (int a=0; a<MAX_ANGLES; a++)
{
for (int p=0; p<MAX_PIXELS; p++)
{
A[a][p] = 0.0;
}
}
}
};
int main(int argc, char* argv[])
{
if(argc < 2)
{
cerr << "arguments missing" << endl;
cerr << "Usage : AnalyzeCT myFile.root " << endl;
exit(EXIT_FAILURE);
}
// Store the root file name in 'fileName' variable
char* const FILENAME = argv[ 1 ];
// parameters for the histograms
float a;
SDataA *dataA=NULL;
dataA = new SDataA;
dataA->Reset();
int maxangles=MAX_ANGLES;
int pixelsx=PIXELS_X;
TApplication app("Application", &argc, argv);
// Open (check) and read the root file
TFile* file = new TFile(FILENAME);
if(!file->IsOpen())
{
cerr << "problem opening the root file : '" << FILENAME << "'" << endl;
cerr << strerror(errno) << endl;
exit(EXIT_FAILURE);
}
// Take the single tree, where is the position, the energy and the runID
TTree* singlesTree = (TTree*)file->Get("Singles");
Int_t runID, pixelID;
singlesTree->SetBranchAddress("runID", &runID);
singlesTree->SetBranchAddress("pixelID", &pixelID);
// Number of entries in the single tree
Int_t entriesSingleTree = (Int_t)singlesTree->GetEntries();
cout << "Number of detected photons : " << entriesSingleTree << endl;
for(Int_t i = 0; i != entriesSingleTree; ++i)
{
singlesTree->GetEntry(i);
if ((runID < MAX_ANGLES) && (pixelID < MAX_PIXELS))
{
dataA->A[runID][pixelID] += 1;
a=dataA->A[runID][pixelID];
// cout << "A[" << runID <<"]["<< pixelID<<"] ="<< a << endl;
}
}
std::ofstream ofile("Slice.bin", std::ios::binary);
int currangle=0;
short BM=19778;
short bfReserved=0,biPlanes=1,biBitCount=32;
int bfSize=54+40000, bfOffBits=54, biSize=40, biWidth=PIXELS_X, biHeight=PIXELS_Y,Zero=0,biClrUsed=1;
ofile.write((char*) &BM, sizeof(short));
ofile.write((char*) &bfSize, sizeof(int));
ofile.write((char*) &bfReserved, sizeof(short));
ofile.write((char*) &bfReserved, sizeof(short));
ofile.write((char*) &bfOffBits, sizeof(int));
ofile.write((char*) &biSize, sizeof(int));
ofile.write((char*) &biWidth, sizeof(int));
ofile.write((char*) &biHeight, sizeof(int));
ofile.write((char*) &biPlanes, sizeof(short));
ofile.write((char*) &biBitCount, sizeof(short));
ofile.write((char*) &Zero, sizeof(int));
ofile.write((char*) &Zero, sizeof(int));
ofile.write((char*) &Zero, sizeof(int));
ofile.write((char*) &Zero, sizeof(int));
ofile.write((char*) &biClrUsed, sizeof(int));
ofile.write((char*) &Zero, sizeof(int));
for (Int_t k =currangle ; k<currangle+1; k++){
for (Int_t j=0; j<MAX_PIXELS; j++){
a=dataA->A[k][j];
//cout<< dataA->A[k][j]<< endl;
ofile.write((char*) &a, sizeof(float)); //s1
}
}
ofile.close();
cout << "Done" << endl;
delete singlesTree;
delete gateTree;
app.Run();
return 0;
}
は不完全なようですが、私は元のコードではコメントアウトされているいくつかの部分を削除してきたので、それはだ、いくつかのチャンクがあるかもしれませんし、それが今、本当にフランケンシュタインの怪物です。
実際には40054バイトの長さのファイル(ヘッダーから54、10000浮動小数点から40000)を取得しています。読み込み可能かどうかを確認するために.bmpに名前を変更していますがヘッダーには一貫しない定義があるかもしれないと思うが、私は全く手がかりがない。
は、私も自分のDATファイルを読むためにOpenCVのを使用しようとしましたが、私のマシンが台無しにされ、私はそれから抜け出すことができるすべては、エラーEDITは:1) は、ここで私はそれらを開くhttps://ufile.io/86210 DATファイルがありますアミドでは、シミュレーションで生成された投影の1つが含まれています。浮動小数点数は現在の数値にはあまりにも大きいかもしれませんが、カウント数が多いほどシミュレーションに入る必要があるかもしれません。ここで
は、ルート・ファイルがhttps://ufile.io/a073
EDIT:2) 真、biSizeは今biSize = 40は、画像がすべて赤と黒のですが、何それが必要のように見える作品、設定されませんでした。リンクは/ 0a111の前の終わりのようになります(私はそれを投稿するためにもっと評判が必要です)私はそれはあまりにも愚かなことだった残念だった、私は数日間苦労してきたと私はフォーカスを失った
ファイルをリンクする方法私は
敬具、
私はそれが間違っている見る最初の事はbisize'が初期化されていない 'ということです。 –
私はあなたが32bitのグレースケール画像を得ることはできないと思っています。グレースケールは赤と青が等しく、単一のコンポーネントは256の値しか持たないことを意味します。 – alangab
ソフトウェアを全く書かずにこれを行うことができます。あなたはサンプルデータファイルを提供できますか? –