The Image Concept
It is somewhat obvious that an image processing library should offer a representation of an image at its heart. In a simplistic, object oriented implementation, this may be done using an Image class construct. The image representation in IPLT, however, offers more than that, and is more involving. For this reason, it is worthwhile to differentiate between the Image Concept, ie the abstract functionality/behaviour, and the actual representations, ie Image classes, whose interfaces implement this abstract functionality. (In regard to object oriented design, this is thinking and designing on one additional abstraction layer above the class/object structure provided by the particular language).
On the conceptual level, an Image in IPLT is defined by several characteristics:
- Extent, which defines the size, dimensionality, and (spatial) origin
- DataType?, which represents the pixel value type, either REAL or COMPLEX
- DataDomain?, which is either SPATIAL, FREQUENCY, or HALF_FREQUENCY
- PixelSampling?, which allows interconversion between integer pixels and physical distances
- A memory area that allows storage and retrieval of pixel values based on pixel indices, when the latter lies within the Extent boundaries
The representation of this concept is offered on a high-level by the ImageHandle, providing a unified construct that offers access to the above characteristics, plus a wealth of other features. The same concept is again represented on a low-level by a collection of ImageStates, one for each particular type/domain combo. Internally, an ImageHandle will always refer to an actual ImageState, from which it retrieves and to where it stores all information.
On consequence of this arrangement is, therefore, that the characteristics DataType? and DataDomain? are implicitly contained within a certain ImageState, while they must be explicitely requested from an ImageHandle. Another consequence is the possibility to have direct access to the data memory area from an ImageState, while this can only be done via member functions for an ImageHandle.
