A ton of information on WCS is here:
http://fits.gsfc.nasa.gov/fits_wcs.html
You probably want to read Paper 1.
Here’s a brief synopsis of fields you need in an image:
(Note that FITS is old enough to be FORTRAN-based, so all counting starts at 1
instead of 0).
The idea for the linear transformations is that you tie the pixel and
scientific coordinate grids together at a single datum, at which you specify
both coordinate systems. Then you specify scale and rotation, or else a
(constant) Jacobian matrix. Nonlinear transformations get more WCS parameters,
but I don’t really use nonlinear WCS yet.
NAXIS - number of dimensions your data points hold
NAXIS<n> - size of each axis (note that <n> starts at 1 instead of 0)
CTYPE<n> - name of the <n>th coordinate (e.g., “Elapsed time”, “Declination”,
“Temperature”, or whatever)
CUNIT<n> - unit used to express the <n>th coordinate (e.g., “Sec”, “Degree”,
“Kelvin”, or whatever)
CRPIX<n> - <n>th pixel coordinate of the datum (1-based, so the center of the
first pixel has value 1 instead of 0, and the left edge of that pixel has value
0.5 instead of -0.5).
CRVAL<n> - <n>th scientific coordinate of the datum (floating point)
CDELT<n> - if present, this is the scale of the the <n>th scientific
coordinate, in CUNIT<n>s per pixel. But see below
CD<n>_<m> - the <n,m> value of the Jacobian matrix relating pixel coordinate to
scientific coordinate. Unspecified fields default to 0. If your data are not
rotated or sheared, then this is a diagonal matrix, and you could get away with
using CDELT<n> instead.
CROTA - you might be tempted to use this legacy keyword. Don’t. It leads to a
world of pain.
The PDL::Transform code will see and use these if they are present. Note that,
as currently implemented, header copying takes about as much time as 10,000
mathematical operations — so PDL disables header copying by default for many
operations. If you want scientific headers to propagate you have to explicitly
turn on header copying in your source PDL.
Cheers,
Craig
> On Oct 31, 2016, at 10:14 AM, Ingo Schmid <[email protected]> wrote:
>
> Hi Craig,
>
> thanks for explaining. I guess the best approach is to map my
> dicom/nifti/etc. header parameters onto FITS parameters. Do you know of a
> document explaining the individual parameters? So far I've found this:
> https://archive.stsci.edu/fits/fits_standard/node40.html#SECTION00942000000000000000
>
> <https://archive.stsci.edu/fits/fits_standard/node40.html#SECTION00942000000000000000>
>
> Specifically, how do I set image orientation, rotation and off-center
> position relative to my WCS in a FITS header hash?
> Just an example, Imagine a stack of images who's orthogonal is tilted by 30
> degrees off the y-axis and rotated 45 degrees in-plane.
>
> Actual data has a time dimension, is complex and has 2 other dimensions, but
> these are rather simple since rotations don't make sense there.
>
> Ingo
>
> On 10/31/2016 04:16 PM, Craig DeForest wrote:
>> Hi, Ingo,
>>
>> PDL::Transform itself deals with coordinate transformations alone. So you
>> are tasked with tracking the transformations between different frames. It
>> provides a collection of parameterized transformation constructors and a
>> basic syntax for composing and inverting those transformations objects. You
>> can apply a transformation to vector data arranged as row vectors (e.g., if
>> your data have four independent variables, they are expected to have a dim 0
>> of size 4), or map an image whose index variables are related to the values
>> of the independent variables. That functionality doesn’t require tracking
>> anything in particular beyond the coordinate transformation that you are
>> using: all the parameters are encapsulated in the transformation object.
>>
>> But PDL::Transform *does* have the ability to interpret and use the World
>> Coordinate System (WCS), which is a part of the Flexible Image Transport
>> System (FITS) standard. FITS files include metadata stored as keyword/value
>> pairs in ASCII, human-readable punch-card analogs in a fixed-length header
>> record at the beginning of the image. FITS headers are close enough to Perl
>> hashes that you can place one in the hash-ref header field of a PDL. (This
>> is made easier by the Astro::FITS::Header module, which creates a tied hash
>> that behaves exactly like a FITS header, but that isn’t strictly necessary).
>>
>>
>> WCS uses certain keywords in the FITS header to represent parameters of a
>> transformation relating pixel index to actual scientific parameters.
>> PDL::Transform can interpret those keywords automagically, so you can deal
>> with the underlying physical coordinates rather than the raw pixel indices.
>> That part of the code is extremely well tested and mature for images, but
>> less well tested for higher dimensionality (though it should work and has
>> worked in some applications). The FITS header interpretation currently
>> only deals with the linear portion of FITS headers: for about 5-6 years
>> there has been a standard for a family of nonlinear transformations that can
>> be specified (to deal with telescope distortions of various kinds) but these
>> have not been implemented.
>>
>> Cheers,
>> Craig
>>
>>
>>> On Oct 31, 2016, at 3:35 AM, Ingo Schmid <[email protected]
>>> <mailto:[email protected]>> wrote:
>>>
>>> Hi,
>>>
>>> finally I have to really face the issue of using real-world coordinates for
>>> my piddles. So far, I've ignored rotations, which I no longer can do. I
>>> guess there are already a couple of implementations of at least some of the
>>> features I need, so before I reinvent the wheel I wanted to ask if you
>>> could point me to some solution.
>>>
>>> Basically, I have data in cuboids in space with arbitrary rotation,
>>> translation and pixel scaling. Now I would like to e.g. extract data from
>>> the same spatial volume or add them together, etc. They may have extra
>>> dimensions as well, some without equally spacing, some with non-numeric
>>> coordinates.
>>>
>>> I guess PDL::Transform is good for that.
>>>
>>> How do you effectively store and attach/receive the information? I guess as
>>> translation/rotation/scaling vectors in the header and some methods to
>>> translate the slicing? How to translate this to an arbitrary number of
>>> dimensions?
>>>
>>>
>>> Ingo
>>>
>>> ------------------------------------------------------------------------------
>>> The Command Line: Reinvented for Modern Developers
>>> Did the resurgence of CLI tooling catch you by surprise?
>>> Reconnect with the command line and become more productive.
>>> Learn the new .NET and ASP.NET <http://asp.net/> CLI. Get your free copy!
>>> http://sdm.link/telerik_______________________________________________
>>> <http://sdm.link/telerik_______________________________________________>
>>> pdl-general mailing list
>>> [email protected] <mailto:[email protected]>
>>> https://lists.sourceforge.net/lists/listinfo/pdl-general
>>> <https://lists.sourceforge.net/lists/listinfo/pdl-general>
>>
>
------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today. http://sdm.link/xeonphi
_______________________________________________
pdl-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/pdl-general