CSharpFits:写入 FITS-file 导致图像错误
CSharpFits: Writing FITS-file results in wrong image
我目前正在开发一个 C# 项目来减少阶梯光栅光谱,它基本上是 FITS 格式的 2D 16 位图像。现在的最终结果应该是另一个 FITS-file,但是 one-dimensional.
对于此任务,我使用 CSharpFits-library (https://github.com/SidWatch/CSharpFITS), a port from a Java-Implementation (https://github.com/nom-tam-fits/nom-tam-fits),所有文档都位于此处。
我还处于这个库的学习阶段。到目前为止,我可以成功读取 FITS-file,将其转换为 int
的数组并处理数据。但是尝试写一个 FITS-file 给了我一个我无法理解的特殊问题。下面的代码,作为玩具示例,产生如图所示的结果。
private void SaveFits()
{
int[][] array = new int[10][];
int delta = 65536 / 100;
for (int i = 0; i < array.Length; i++)
{
array[i] = new int[10];
for (int j = 0; j < array[i].Length; j++)
{
array[i][j] = (i + 1) * (j + 1) * delta;
}
}
nom.tam.fits.Fits fits = new nom.tam.fits.Fits();
nom.tam.fits.BasicHDU hdu = nom.tam.fits.Fits.MakeHDU(array);
hdu.AddValue("BITPIX", 16, null); // set bit depth of 16 bit
hdu.AddValue("NAXIS", 2, null); // 2D-image
fits.AddHDU(hdu); // Debugging here shows correct HDU-data, i.e. gradient from top left to bottom right
nom.tam.util.BufferedFile file = new nom.tam.util.BufferedFile(@"D:\test.fits", System.IO.FileAccess.ReadWrite, System.IO.FileShare.ReadWrite);
fits.Write(file);
file.Flush();
file.Close();
}
pixel-representation of 10-by-10-pixel FITS-file
如您所见,代码应生成一个 16 位图像,其灰度从左上角到右下角渐变。创建 HDU 后,其数据数组的控制台输出为
655 1310 1965 2620 3275 3930 4585 5240 5895 6550
1310 2620 3930 5240 6550 7860 9170 10480 11790 13100
1965 3930 5895 7860 9825 11790 13755 15720 17685 19650
2620 5240 7860 10480 13100 15720 18340 20960 23580 26200
3275 6550 9825 13100 16375 19650 22925 26200 29475 32750
3930 7860 11790 15720 19650 23580 27510 31440 35370 39300
4585 9170 13755 18340 22925 27510 32095 36680 41265 45850
5240 10480 15720 20960 26200 31440 36680 41920 47160 52400
5895 11790 17685 23580 29475 35370 41265 47160 53055 58950
6550 13100 19650 26200 32750 39300 45850 52400 58950 65500
然而在最终图像中(在 PixInsight 中查看,但任何其他可以显示 FITS-images 的程序显示相同)每隔一列只有值为 0 的像素,并且每隔一行重复第一行.
到目前为止,我已经尝试将 HDU 实际上创建为 ImageHDU
,但没有效果。
我还检查了 correctly-read FITS 文件的 HDU-header-fields,并尝试在我的文件中手动设置它们(使用 hdu.AddValue
),但到目前为止没有任何效果。
可以在此处找到使用 CSharpFITS 编写 FITS-files 的几个示例 (https://csharp.hotexamples.com/examples/nom.tam.fits/Fits/Write/php-fits-write-method-examples.html),但除了我所做的以外,没有其他使用。
非常感谢您的建议。谢谢!
根据 Iguananauts 的评论,将 int
数组更改为 short
数组会得到预期的结果。
我目前正在开发一个 C# 项目来减少阶梯光栅光谱,它基本上是 FITS 格式的 2D 16 位图像。现在的最终结果应该是另一个 FITS-file,但是 one-dimensional.
对于此任务,我使用 CSharpFits-library (https://github.com/SidWatch/CSharpFITS), a port from a Java-Implementation (https://github.com/nom-tam-fits/nom-tam-fits),所有文档都位于此处。
我还处于这个库的学习阶段。到目前为止,我可以成功读取 FITS-file,将其转换为 int
的数组并处理数据。但是尝试写一个 FITS-file 给了我一个我无法理解的特殊问题。下面的代码,作为玩具示例,产生如图所示的结果。
private void SaveFits()
{
int[][] array = new int[10][];
int delta = 65536 / 100;
for (int i = 0; i < array.Length; i++)
{
array[i] = new int[10];
for (int j = 0; j < array[i].Length; j++)
{
array[i][j] = (i + 1) * (j + 1) * delta;
}
}
nom.tam.fits.Fits fits = new nom.tam.fits.Fits();
nom.tam.fits.BasicHDU hdu = nom.tam.fits.Fits.MakeHDU(array);
hdu.AddValue("BITPIX", 16, null); // set bit depth of 16 bit
hdu.AddValue("NAXIS", 2, null); // 2D-image
fits.AddHDU(hdu); // Debugging here shows correct HDU-data, i.e. gradient from top left to bottom right
nom.tam.util.BufferedFile file = new nom.tam.util.BufferedFile(@"D:\test.fits", System.IO.FileAccess.ReadWrite, System.IO.FileShare.ReadWrite);
fits.Write(file);
file.Flush();
file.Close();
}
pixel-representation of 10-by-10-pixel FITS-file
如您所见,代码应生成一个 16 位图像,其灰度从左上角到右下角渐变。创建 HDU 后,其数据数组的控制台输出为
655 1310 1965 2620 3275 3930 4585 5240 5895 6550
1310 2620 3930 5240 6550 7860 9170 10480 11790 13100
1965 3930 5895 7860 9825 11790 13755 15720 17685 19650
2620 5240 7860 10480 13100 15720 18340 20960 23580 26200
3275 6550 9825 13100 16375 19650 22925 26200 29475 32750
3930 7860 11790 15720 19650 23580 27510 31440 35370 39300
4585 9170 13755 18340 22925 27510 32095 36680 41265 45850
5240 10480 15720 20960 26200 31440 36680 41920 47160 52400
5895 11790 17685 23580 29475 35370 41265 47160 53055 58950
6550 13100 19650 26200 32750 39300 45850 52400 58950 65500
然而在最终图像中(在 PixInsight 中查看,但任何其他可以显示 FITS-images 的程序显示相同)每隔一列只有值为 0 的像素,并且每隔一行重复第一行.
到目前为止,我已经尝试将 HDU 实际上创建为 ImageHDU
,但没有效果。
我还检查了 correctly-read FITS 文件的 HDU-header-fields,并尝试在我的文件中手动设置它们(使用 hdu.AddValue
),但到目前为止没有任何效果。
可以在此处找到使用 CSharpFITS 编写 FITS-files 的几个示例 (https://csharp.hotexamples.com/examples/nom.tam.fits/Fits/Write/php-fits-write-method-examples.html),但除了我所做的以外,没有其他使用。
非常感谢您的建议。谢谢!
根据 Iguananauts 的评论,将 int
数组更改为 short
数组会得到预期的结果。