3from __future__
import annotations
6from typing
import Any, cast, List
10from ids_peak_ipl
import ids_peak_ipl
12from ids_peak_common.datatypes.geometry.size
import Size
13from ids_peak_common.datatypes.iimageview
import IImageView
14from ids_peak_common.datatypes.metadata
import Metadata
15from ids_peak_common.datatypes.pixelformat
import PixelFormat, Channel
17from ids_peak_icv
import lib_loader
20 peak_icv_image_handle,
22 peak_icv_capture_information,
23 peak_icv_binning_factor,
26 execute_and_map_return_codes,
27 check_init_for_classes_with_classmethods_only,
28 metadata_to_capture_information,
29 metadata_from_capture_information,
30 add_metadata_from_capture_information_to_metadata, create_array, transform
34from typing
import TYPE_CHECKING
43 Image Class for working with algorithms.
45 @since ids_peak_icv 1.0
46 @ingroup ids_peak_icv_python_types
55 Creates an instance of Image using a size.Size and a pixel format
57 @param size: Image size in pixels
58 @param pixel_format: Pixel format of the image
59 @return Returns an image instance.
61 @since ids_peak_icv 1.0
67 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_Create,
68 ctypes.pointer(image_handle),
69 ctypes.c_int(pixel_format.value),
72 return Image(_handle=image_handle)
78 Creates an instance of Image using a ids_peak_ipl image.
80 @param ids_peak_ipl_image: ids_peak_ipl image
81 @return Created an image instance.
83 @since ids_peak_icv 1.0
85 numpy_data = (np.array(ids_peak_ipl_image.DataView(), dtype=np.uint8)
if
86 ids_peak_ipl_image.PixelFormat().IsPacked()
else ids_peak_ipl_image.get_numpy())
88 pixel_format=ids_peak_ipl_image.PixelFormat().PixelFormatName(),
89 size=
peak_common_size(ids_peak_ipl_image.Width(), ids_peak_ipl_image.Height()),
90 buffer_size=ids_peak_ipl_image.ByteCount(),
91 buffer=numpy_data.ctypes.data_as(ctypes.POINTER(ctypes.c_uint8))
95 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_CreateFromImageInfo,
96 ctypes.pointer(image_handle),
98 ctypes.sizeof(image_info))
100 time_stamp=ids_peak_ipl_image.Timestamp())
101 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_SetCaptureInformation, image_handle,
102 c_capture_information, ctypes.sizeof(c_capture_information))
104 return cls(_handle=image_handle, _ids_peak_ipl_image=ids_peak_ipl_image)
110 Creates an instance of Image using a PixelFormat, size.Size and numpy image buffer.
112 @param pixel_format: Pixel format of the image
113 @param size: Image size in pixels
114 @param data: Numpy array holding the buffer data
116 @return Created an image instance.
118 @exception OutOfRangeException: If the input array is 2D and the expected number of channels is not 1,
119 or if it is 3D and the channel count does not match, or if it has a number of dimensions other than 2 or 3.
121 @since ids_peak_icv 1.0
124 if pixel_format.is_packed:
126 "Creating an image from a packed format is not supported")
134 if pixel_format.number_of_channels != 1:
137 if data.shape[2] != pixel_format.number_of_channels:
139 "Number of channels must be {}".format(pixel_format.number_of_channels))
147 pixel_format=pixel_format.value,
149 buffer_size=data.size * data.itemsize,
150 buffer=data.ctypes.data_as(ctypes.POINTER(ctypes.c_uint8))
153 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_CreateFromImageInfo,
154 ctypes.pointer(image_handle),
156 ctypes.sizeof(image_info))
158 return cls(_handle=image_handle, _data=data)
161 def create_from_file(cls, image_path: str, forced_pixel_format: PixelFormat |
None =
None) -> Image:
164 Creates an Image from a file path.
166 This method loads an image from the given file path.
168 If a PixelFormat is provided via ``forced_pixel_format``,
169 the method attempts to interpret the file using that format.
170 If interpretation fails, an exception is raised.
171 Explicit conversion between image formats must be handled manually by the user.
173 The following image formats are supported:
176 - Joint Photographic Experts Group (JPEG)
177 - Portable Network Graphics (PNG)
178 - @htmlonly Tag Image File Format (TIFF)@endhtmlonly
179 (Only if ``forced_pixel_format`` is specified)
180 - Raw Binary Format (RAW)
182 ### Supported image and pixel formats
185 @supportedPixelformats{ImageLoad_BMP}
187 @supportedPixelformats{ImageLoad_JPEG}
189 @supportedPixelformats{ImageLoad_PNG}
191 If ``forced_pixel_format`` is ``None`` any raw image can be loaded.
193 If ``forced_pixel_format`` is specified, only the following formats are supported
194 and must match the format used when saving:
195 @supportedPixelformats{ImageLoad_RAW_WithPixelFormat}
197 See the @ref concept_type_pixel_format for a detailed description of the pixel formats.
199 @param image_path: File path on disk, pointing to an image.
200 @param forced_pixel_format: Pixel format the loaded image is forced to use.
201 @return The loaded Image as a new instance
203 @since ids_peak_icv 1.0
206 c_image_path = image_path.encode(
'utf-8')
209 if forced_pixel_format
is None:
210 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_CreateFromFile,
211 ctypes.pointer(c_handle), ctypes.c_char_p(c_image_path))
213 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_CreateFromFileWithPixelFormat,
214 ctypes.pointer(c_handle), ctypes.c_char_p(c_image_path),
215 ctypes.c_int(forced_pixel_format.value))
216 return cls(_handle=c_handle)
222 Creates an instance of Image using an IImageView interface.
224 @param image_view: An object implementing the IImageView interface,
225 which can be constructed from a buffer provided by a camera.
226 @return A new `Image` instance created from the given image view.
228 @since ids_peak_icv 1.0
231 image = cls.
_create_from_np_array(image_view.pixel_format, image_view.size, image_view.to_numpy_array())
232 image.metadata = image_view.metadata
235 def __init__(self, *args: Any, **kwargs: Any) ->
None:
238 In order to create an Image, please refer to the classmethods.
240 @since ids_peak_icv 1.0
242 self.
_handle_handle = check_init_for_classes_with_classmethods_only(self.__class__.__name__,
243 peak_icv_image_handle, *args, **kwargs)
249 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_GetInfo,
250 self.
_handle_handle, ctypes.pointer(image_info), ctypes.sizeof(image_info))
255 self.
_size = Size(image_info.size.width, image_info.size.height)
258 _shape = [int(self.
_size.height), int(self.
_size.width)]
260 _shape.append(num_channels)
264 if "_data" in kwargs:
265 self.
_data = kwargs[
"_data"]
272 self.
_raw_data = np.ctypeslib.as_array(image_info.buffer, shape=(
286 Destructor for Image class.
288 if hasattr(self,
'_handle'):
291 def save(self, output_file_path: str) ->
None:
294 Saves the image to a file.
296 The file format is determined
297 by the specified file extension of the file name.
299 Supported image formats (with required file extensions):
300 - PNG (.png) – Portable Network Graphics
301 - BMP (.bmp) – Bitmap
302 - JPEG (.jpeg) – Joint Photographic Experts Group
303 - TIFF (.tiff) – \htmlonly Tag Image File Format\endhtmlonly
304 - RAW (.raw) – Raw Binary Format
306 Compression settings:
310 ### Supported image and pixel formats
313 @supportedPixelformats{ImageSave_BMP}
316 @supportedPixelformats{ImageSave_JPEG}
319 @supportedPixelformats{ImageSave_PNG}
321 @note When saving *BGR* formats to PNG, they are written as *RGB*.
324 @supportedPixelformats{ImageSave_TIFF}
327 When saving floating‑point images to TIFF:
328 Not all image viewers support displaying TIFF files
329 that store floating‑point pixel data.
330 The saved TIFF file is intended primarily as a data container
331 that allows this library to reliably write
332 and later re‑read the data.
335 @supportedPixelformats{ImageSave_RAW}
337 See the @ref concept_type_pixel_format for a detailed description of the pixel formats.
339 @param output_file_path: The path of the file to store the image to disk.
341 @since ids_peak_icv 1.0
343 c_output_file_path = output_file_path.encode(
'utf-8')
344 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_SaveToFile, self.
_handle_handle,
345 ctypes.c_char_p(c_output_file_path))
351 Provides the size.Size of the image.
353 @return Image size in pixels
355 @since ids_peak_icv 1.0
363 Provides the width of the image.
365 @return Image width in pixels
367 @since ids_peak_icv 1.0
369 return int(self.
size.width)
375 Provides the height of the image.
377 @return Image height in pixels
379 @since ids_peak_icv 1.0
381 return int(self.
size.height)
386 Provides a numpy representation of the image.
388 Note that the image is copied by default and the caller must not take care of the original Instance being still
391 @param copy: True: The image is copied, False: The image only references the internal memory.
392 @return Image data as a numpy array. Shape is [height, width] for single channel images.
393 Shape is [height, width, number of channels] for multichannel images.
395 @since ids_peak_icv 1.0
399 return cast(np.ndarray, self.
_data.copy())
406 Converts the image to a different pixel format.
408 If the input image has the same pixel format as the specified pixel format parameter,
409 the image will be copied.
412 - Conversion to Bayer formats is only supported from a bayer format with the same pattern,
413 e.g. from BayerRG10p to BayerRG10 or BayerRG8.
414 - Conversion to packed formats is not supported.
415 - Conversions from RGB or BGR formats to RGBa or BGRa formats is not supported.
416 - RGBa and BGRa formats support only conversions into different bit depths of the same channel layout
418 - Confidence and Coord3D formats can only be converted to other bit depths of the same format type.
421 For a full list of supported conversions see \ref concept_supported_pixel_format_conversion.
423 @param pixel_format: The target pixel format.
425 @return A new Image with the target pixel format.
427 @since ids_peak_icv 1.0
431 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_Create,
432 ctypes.pointer(output_image_handle),
433 ctypes.c_int(pixel_format.value),
436 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_ConvertPixelFormat,
440 return Image(_handle=output_image_handle)
445 Converts an image into another pixel format with a factor multiplied to every pixel.
447 Supported conversions:
448 From PixelFormat::Coord3D_C8 or PixelFormat::Coord3D_C16 to PixelFormat::Coord3D_C32f
450 @param pixel_format: The target pixel format.
451 @param factor: The multiplication factor.
452 @return A new instance of Image with the target pixel format.
454 @since ids_peak_icv 1.1
458 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_Create,
459 ctypes.pointer(output_image_handle),
460 ctypes.c_int(pixel_format.value),
463 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_ConvertPixelFormatWithFactor,
464 self.
_handle_handle, ctypes.c_int(pixel_format.value), ctypes.c_double(factor),
467 return Image(_handle=output_image_handle)
470 def region(self) -> Region:
473 Retrieves the region.Region associated with the specified image_handle.
474 @return The image region.
476 @since ids_peak_icv 1.0
481 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_GetRegion, self.
_handle_handle,
482 ctypes.pointer(region._handle))
486 def region(self, region: Region) ->
None:
489 Updates the region.Region on the image.
491 Sets a region of interest (ROI) for the specified image handle,
492 which defines a sub-area of the image where operations or analyses are focused.
493 Any points in the region that fall outside the bounds of the image are automatically discarded (clipped).
495 @param region: The region to be set.
497 @since ids_peak_icv 1.0
499 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_SetRegion, self.
_handle_handle,
505 Resets the region.Region on the image to the complete image.
507 @since ids_peak_icv 1.0
509 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_ResetRegion, self.
_handle_handle)
515 Retrieves the metadata.Metadata of an image which contains information about
516 the image capture settings.
518 @return The metadata of the image.
520 @since ids_peak_icv 1.0
527 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_GetCaptureInformation, self.
_handle_handle,
528 ctypes.pointer(c_capture_information), ctypes.sizeof(c_capture_information))
530 self.
_metadata = metadata_from_capture_information(c_capture_information)
537 Updates the metadata.Metadata of an image which is used to store and
538 manage capture settings.
540 @param metadata: The metadata to be updated.
542 @since ids_peak_icv 1.0
544 c_capture_information = metadata_to_capture_information(metadata, size=self.
_size)
546 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_SetCaptureInformation, self.
_handle_handle,
547 c_capture_information, ctypes.sizeof(c_capture_information))
548 self.
_metadata = add_metadata_from_capture_information_to_metadata(metadata, c_capture_information)
553 Subtracts the specified subtrahend image pixelwise from the current image and returns the resulting image.
555 This function performs a pixelwise subtraction of the given subtrahend image from the current image.
556 The resulting image is returned as a new `Image` object.
557 The operation requires that both images have the same pixel format and dimensions.
559 @param subtrahend: The image to subtract from the current image.
560 @return The resulting image after pixelwise subtraction.
562 @since ids_peak_icv 1.0
564 difference = Image.create_from_pixel_format_and_size(self.
_pixel_format, self.
size)
565 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_Subtract, self.
_handle_handle,
566 subtrahend._handle, difference._handle)
572 Splits an image with an interleaved pixel format into individual images.
574 The function separates e.g. multiple exposures or gains embedded in the combined HDR raw image
575 and provides them as independent images,
576 each with the correctly associated exposure information.
578 @supportedPixelformats{ImageDeinterleave}
580 @return A list of images, where each element represents one of the deinterleaved images.
582 @since ids_peak_icv 1.3
584 c_num_output_images = ctypes.c_size_t()
585 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_Deinterleave_GetOutputImageCount,
587 ctypes.pointer(c_num_output_images))
589 c_pixel_format = ctypes.c_int()
590 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_Deinterleave_GetOutputPixelFormat,
592 ctypes.pointer(c_pixel_format))
596 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_Deinterleave_GetOutputImageSize,
597 ctypes.c_int(self.
pixel_format.value), c_input_image_size,
598 ctypes.pointer(c_output_image_size))
601 for i
in range(c_num_output_images.value):
602 output_images.append(
603 Image.create_from_pixel_format_and_size(PixelFormat(c_pixel_format.value),
604 Size(c_output_image_size.width, c_output_image_size.height)))
605 output_image_handles = create_array(ctypes.c_void_p, len(output_images))
606 transform(output_images, output_image_handles,
lambda image: image._handle)
608 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_Deinterleave,
610 ctypes.c_size_t(len(output_image_handles)))
614 def __sub__(self, subtrahend: Image) -> Image:
617 Subtracts the specified subtrahend image pixelwise from the current image and returns the resulting image.
619 This function performs a pixelwise subtraction of the given subtrahend image from the current image.
620 The resulting image is returned as a new `Image` object.
621 The operation requires that both images have the same pixel format and dimensions.
623 @param subtrahend: The image to subtract from the current image.
624 @return The resulting image after pixelwise subtraction.
626 @since ids_peak_icv 1.0
631 if not isinstance(other, Image):
635 if self.
size != other.size:
642 is_equal = ctypes.c_bool()
643 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_Compare, self.
_handle_handle, other._handle,
644 ctypes.pointer(is_equal))
646 return is_equal.value
656 Calculate the byte size of an image buffer for a given size and pixel format.
658 @param size: The image dimensions (width, height) in pixels.
659 @param bits_per_pixel: The number of storage bits per pixel for the pixel format.
660 @param packed_or_yuv: If True, assumes packed or yuv format (truncate bits to full bytes).
661 If False, assumes other format (round up to nearest byte).
662 @return The byte size of the buffer.
664 total_bits = int(size.width) * int(size.height) * bits_per_pixel
666 return math.ceil(total_bits / 8)
668 return (total_bits + 7) // 8
672 if isinstance(image_var, ids_peak_ipl.Image):
673 return Image.create_from_ids_peak_ipl_image(image_var)
679 if not isinstance(image_var, Image):
681 "Parameter images has to be a numpy array of ids_peak_icv images.")
Image Class for working with algorithms.
Region region(self)
Retrieves the region.Region associated with the specified image_handle.
Image create_from_ids_peak_ipl_image(cls, ids_peak_ipl.Image ids_peak_ipl_image)
Creates an instance of Image using a ids_peak_ipl image.
Image create_from_np_array(cls, PixelFormat pixel_format, Size size, np.ndarray data)
Creates an instance of Image using a PixelFormat, size.Size and numpy image buffer.
None region(self, Region region)
Updates the region.Region on the image.
Image __sub__(self, Image subtrahend)
Subtracts the specified subtrahend image pixelwise from the current image and returns the resulting i...
None __init__(self, *Any args, **Any kwargs)
In order to create an Image, please refer to the classmethods.
None save(self, str output_file_path)
Saves the image to a file.
Image create_from_pixel_format_and_size(cls, PixelFormat pixel_format, Size size)
Creates an instance of Image using a size.Size and a pixel format.
bool __eq__(self, object other)
None reset_region(self)
Resets the region.Region on the image to the complete image.
Image convert_pixel_format_with_factor(self, PixelFormat pixel_format, float factor)
Converts an image into another pixel format with a factor multiplied to every pixel.
PixelFormat pixel_format(self)
None __del__(self)
Destructor for Image class.
List[Image] deinterleave(self)
Splits an image with an interleaved pixel format into individual images.
Metadata metadata(self)
Retrieves the metadata.Metadata of an image which contains information about the image capture settin...
int height(self)
Provides the height of the image.
Image _create_from_np_array(cls, PixelFormat pixel_format, Size size, np.ndarray data)
Image convert_pixel_format(self, PixelFormat pixel_format)
Converts the image to a different pixel format.
Size size(self)
Provides the size.Size of the image.
Image subtract(self, Image subtrahend)
Subtracts the specified subtrahend image pixelwise from the current image and returns the resulting i...
Image create_from_file(cls, str image_path, PixelFormat|None forced_pixel_format=None)
Creates an Image from a file path.
Image create_from_image_view(cls, IImageView image_view)
Creates an instance of Image using an IImageView interface.
np.ndarray to_numpy_array(self, bool copy=True)
Provides a numpy representation of the image.
int width(self)
Provides the width of the image.
Represents a region consisting of a set of points in the image plane.
Occurs when a requested operation is not implemented or supported (e.g., exporting to an unsupported ...
Occurs when a provided value falls outside the allowed valid range.
int _get_byte_size(Size size, int bits_per_pixel, bool packed_or_yuv)
Calculate the byte size of an image buffer for a given size and pixel format.
Any _check_and_get_icv_image(Any image_var)
Any _check_icv_image(Any image_var)