3from __future__
import annotations
6from typing
import Any, cast
10from ids_peak_ipl
import ids_peak_ipl
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,
33from typing
import TYPE_CHECKING
42 Image Class for working with algorithms.
44 @since ids_peak_icv 1.0
45 @ingroup ids_peak_icv_python_types
54 Creates an instance of Image using a size.Size and a pixel format
56 @param size: Image size in pixels
57 @param pixel_format: Pixel format of the image
58 @return Returns an image instance.
60 @since ids_peak_icv 1.0
66 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_Create,
67 ctypes.pointer(image_handle),
68 ctypes.c_int(pixel_format.value),
71 return Image(_handle=image_handle)
77 Creates an instance of Image using a ids_peak_ipl image.
79 @param ids_peak_ipl_image: ids_peak_ipl image
80 @return Created an image instance.
82 @since ids_peak_icv 1.0
84 numpy_data = (np.array(ids_peak_ipl_image.DataView(), dtype=np.uint8)
if
85 ids_peak_ipl_image.PixelFormat().IsPacked()
else ids_peak_ipl_image.get_numpy())
87 pixel_format=ids_peak_ipl_image.PixelFormat().PixelFormatName(),
88 size=
peak_common_size(ids_peak_ipl_image.Width(), ids_peak_ipl_image.Height()),
89 buffer_size=ids_peak_ipl_image.ByteCount(),
90 buffer=numpy_data.ctypes.data_as(ctypes.POINTER(ctypes.c_uint8))
94 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_CreateFromImageInfo,
95 ctypes.pointer(image_handle),
97 ctypes.sizeof(image_info))
99 time_stamp=ids_peak_ipl_image.Timestamp())
100 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_SetCaptureInformation, image_handle,
101 c_capture_information, ctypes.sizeof(c_capture_information))
103 return cls(_handle=image_handle, _ids_peak_ipl_image=ids_peak_ipl_image)
109 Creates an instance of Image using a PixelFormat, size.Size and numpy image buffer.
111 @param pixel_format: Pixel format of the image
112 @param size: Image size in pixels
113 @param data: Numpy array holding the buffer data
115 @return Created an image instance.
117 @exception OutOfRangeException: If the input array is 2D and the expected number of channels is not 1,
118 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.
120 @since ids_peak_icv 1.0
123 if pixel_format.number_of_channels != 1:
126 if data.shape[2] != pixel_format.number_of_channels:
128 "Number of channels must be {}".format(pixel_format.number_of_channels))
136 pixel_format=pixel_format.value,
138 buffer_size=data.size * data.itemsize,
139 buffer=data.ctypes.data_as(ctypes.POINTER(ctypes.c_uint8))
142 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_CreateFromImageInfo,
143 ctypes.pointer(image_handle),
145 ctypes.sizeof(image_info))
147 return cls(_handle=image_handle, _data=data)
150 def create_from_file(cls, image_path: str, forced_pixel_format: PixelFormat |
None =
None) -> Image:
153 Creates an Image from a file path.
155 This method loads an image from the given file path.
157 If a PixelFormat is provided via ``forced_pixel_format``,
158 the method attempts to interpret the file using that format.
159 If interpretation fails, an exception is raised.
160 Explicit conversion between image formats must be handled manually by the user.
162 The following image formats are supported:
165 - Joint Photographic Experts Group (JPEG)
166 - Portable Network Graphics (PNG)
167 - @htmlonly Tag Image File Format (TIFF)@endhtmlonly
168 (Only if ``forced_pixel_format`` is specified)
169 - Raw Binary Format (RAW)
171 ### Supported image and pixel formats
174 @supportedPixelformats{ImageLoad_BMP}
176 @supportedPixelformats{ImageLoad_JPEG}
178 @supportedPixelformats{ImageLoad_PNG}
180 If ``forced_pixel_format`` is ``None`` any raw image can be loaded.
182 If ``forced_pixel_format`` is specified, only the following formats are supported
183 and must match the format used when saving:
184 @supportedPixelformats{ImageLoad_RAW_WithPixelFormat}
186 See the @ref concept_type_pixel_format for a detailed description of the pixel formats.
188 @param image_path: File path on disk, pointing to an image.
189 @param forced_pixel_format: Pixel format the loaded image is forced to use.
190 @return The loaded Image as a new instance
192 @since ids_peak_icv 1.0
195 c_image_path = image_path.encode(
'utf-8')
198 if forced_pixel_format
is None:
199 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_CreateFromFile,
200 ctypes.pointer(c_handle), ctypes.c_char_p(c_image_path))
202 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_CreateFromFileWithPixelFormat,
203 ctypes.pointer(c_handle), ctypes.c_char_p(c_image_path),
204 ctypes.c_int(forced_pixel_format.value))
205 return cls(_handle=c_handle)
211 Creates an instance of Image using an IImageView interface.
213 @param image_view: An object implementing the IImageView interface,
214 which can be constructed from a buffer provided by a camera.
215 @return A new `Image` instance created from the given image view.
217 @since ids_peak_icv 1.0
220 image = cls.
create_from_np_array(image_view.pixel_format, image_view.size, image_view.to_numpy_array())
221 image.metadata = image_view.metadata
224 def __init__(self, *args: Any, **kwargs: Any) ->
None:
227 In order to create an Image, please refer to the classmethods.
229 @since ids_peak_icv 1.0
231 self.
_handle_handle = check_init_for_classes_with_classmethods_only(self.__class__.__name__,
232 peak_icv_image_handle, *args, **kwargs)
238 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_GetInfo,
239 self.
_handle_handle, ctypes.pointer(image_info), ctypes.sizeof(image_info))
244 self.
_size =
Size(image_info.size.width, image_info.size.height)
247 _shape = [int(self.
_size.height), int(self.
_size.width)]
249 _shape.append(num_channels)
253 if "_data" in kwargs:
254 self.
_data = kwargs[
"_data"]
261 self.
_raw_data = np.ctypeslib.as_array(image_info.buffer, shape=(
275 Destructor for Image class.
277 if hasattr(self,
'_handle'):
280 def save(self, output_file_path: str) ->
None:
283 Saves an instance to a file on disk. The type is specified by the given file ending in file name.
285 The following image formats are supported:
286 - Portable Network Graphics (PNG)
288 - Joint Photographic Experts Group (JPEG)
289 - @htmlonly Tag Image File Format@endhtmlonly (TIFF)
290 - Raw Binary Format (RAW)
292 The compression settings for PNG and JPEG images are as follows:
293 For JPEG, the image quality is set to 75%, and for PNG, the image quality is set to 100%.
295 @note The file extension for the given file name must match the specified image format when an image is saved.
296 Otherwise, an error will occur when saving an image. The file extensions are:
303 ### Supported image and pixel formats
306 @supportedPixelformats{ImageSave_BMP}
308 @supportedPixelformats{ImageSave_JPEG}
310 @supportedPixelformats{ImageSave_PNG}
312 @supportedPixelformats{ImageSave_TIFF}
314 @supportedPixelformats{ImageSave_RAW}
316 See the @ref concept_type_pixel_format for a detailed description of the pixel formats.
318 @param output_file_path: The path of the file to store the image to disk.
320 @since ids_peak_icv 1.0
322 c_output_file_path = output_file_path.encode(
'utf-8')
323 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_SaveToFile, self.
_handle_handle,
324 ctypes.c_char_p(c_output_file_path))
330 Provides the size.Size of the image.
332 @return Image size in pixels
334 @since ids_peak_icv 1.0
342 Provides the width of the image.
344 @return Image width in pixels
346 @since ids_peak_icv 1.0
348 return int(self.
size.width)
354 Provides the height of the image.
356 @return Image height in pixels
358 @since ids_peak_icv 1.0
360 return int(self.
size.height)
365 Provides a numpy representation of the image.
367 Note that the image is copied by default and the caller must not take care of the original Instance being still
370 @param copy: True: The image is copied, False: The image only references the internal memory.
371 @return Image data as a numpy array. Shape is [height, width] for single channel images.
372 Shape is [height, width, number of channels] for multichannel images.
374 @since ids_peak_icv 1.0
378 return cast(np.ndarray, self.
_data.copy())
385 Converts the image to a different pixel format.
387 If the input image has the same pixel format as the specified pixel format parameter,
388 the image will be copied.
391 - Conversion to Bayer formats is only supported from a bayer format with the same pattern,
392 e.g. from BayerRG10p to BayerRG10 or BayerRG8.
393 - Conversion to packed formats is not supported.
394 - Conversions from RGB or BGR formats to RGBa or BGRa formats is not supported.
395 - RGBa and BGRa formats support only conversions into different bit depths of the same channel layout
397 - Confidence and Coord3D formats can only be converted to other bit depths of the same format type.
400 For a full list of supported conversions see \ref concept_supported_pixel_format_conversion.
402 @param pixel_format: The target pixel format.
404 @return A new Image with the target pixel format.
406 @since ids_peak_icv 1.0
410 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_Create,
411 ctypes.pointer(output_image_handle),
412 ctypes.c_int(pixel_format.value),
415 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_ConvertPixelFormat,
419 return Image(_handle=output_image_handle)
424 Converts an image into another pixel format with a factor multiplied to every pixel.
426 Supported conversions:
427 From PixelFormat::Coord3D_C8 or PixelFormat::Coord3D_C16 to PixelFormat::Coord3D_C32f
429 @param pixel_format: The target pixel format.
430 @param factor: The multiplication factor.
431 @return A new instance of Image with the target pixel format.
433 @since ids_peak_icv 1.1
437 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_Create,
438 ctypes.pointer(output_image_handle),
439 ctypes.c_int(pixel_format.value),
442 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_ConvertPixelFormatWithFactor,
443 self.
_handle_handle, ctypes.c_int(pixel_format.value), ctypes.c_double(factor),
446 return Image(_handle=output_image_handle)
449 def region(self) -> Region:
452 Retrieves the region.Region associated with the specified image_handle.
453 @return The image region.
455 @since ids_peak_icv 1.0
460 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_GetRegion, self.
_handle_handle,
461 ctypes.pointer(region._handle))
465 def region(self, region: Region) ->
None:
468 Updates the region.Region on the image.
470 Sets a region of interest (ROI) for the specified image handle,
471 which defines a sub-area of the image where operations or analyses are focused.
472 Any points in the region that fall outside the bounds of the image are automatically discarded (clipped).
474 @param region: The region to be set.
476 @since ids_peak_icv 1.0
478 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_SetRegion, self.
_handle_handle,
484 Resets the region.Region on the image to the complete image.
486 @since ids_peak_icv 1.0
488 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_ResetRegion, self.
_handle_handle)
494 Retrieves the metadata.Metadata of an image which contains information about
495 the image capture settings.
497 @return The metadata of the image.
499 @since ids_peak_icv 1.0
506 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_GetCaptureInformation, self.
_handle_handle,
507 ctypes.pointer(c_capture_information), ctypes.sizeof(c_capture_information))
509 self.
_metadata = metadata_from_capture_information(c_capture_information)
516 Updates the metadata.Metadata of an image which is used to store and
517 manage capture settings.
519 @param metadata: The metadata to be updated.
521 @since ids_peak_icv 1.0
523 c_capture_information = metadata_to_capture_information(metadata, size=self.
_size)
525 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_SetCaptureInformation, self.
_handle_handle,
526 c_capture_information, ctypes.sizeof(c_capture_information))
527 self.
_metadata = metadata_from_capture_information(c_capture_information)
532 Subtracts the specified subtrahend image pixelwise from the current image and returns the resulting image.
534 This function performs a pixelwise subtraction of the given subtrahend image from the current image.
535 The resulting image is returned as a new `Image` object.
536 The operation requires that both images have the same pixel format and dimensions.
538 @param subtrahend: The image to subtract from the current image.
539 @return The resulting image after pixelwise subtraction.
541 @since ids_peak_icv 1.0
543 difference = Image.create_from_pixel_format_and_size(self.
_pixel_format, self.
size)
544 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_Subtract, self.
_handle_handle,
545 subtrahend._handle, difference._handle)
548 def __sub__(self, subtrahend: Image) -> Image:
551 Subtracts the specified subtrahend image pixelwise from the current image and returns the resulting image.
553 This function performs a pixelwise subtraction of the given subtrahend image from the current image.
554 The resulting image is returned as a new `Image` object.
555 The operation requires that both images have the same pixel format and dimensions.
557 @param subtrahend: The image to subtract from the current image.
558 @return The resulting image after pixelwise subtraction.
560 @since ids_peak_icv 1.0
565 if not isinstance(other, Image):
569 if self.
size != other.size:
576 is_equal = ctypes.c_bool()
577 execute_and_map_return_codes(lib_loader.dll().peak_icv_Image_Compare, self.
_handle_handle, other._handle,
578 ctypes.pointer(is_equal))
580 return is_equal.value
590 Calculate the byte size of an image buffer for a given size and pixel format.
592 @param size: The image dimensions (width, height) in pixels.
593 @param bits_per_pixel: The number of storage bits per pixel for the pixel format.
594 @param packed_or_yuv: If True, assumes packed or yuv format (truncate bits to full bytes).
595 If False, assumes other format (round up to nearest byte).
596 @return The byte size of the buffer.
598 total_bits = int(size.width) * int(size.height) * bits_per_pixel
600 return math.ceil(total_bits / 8)
602 return (total_bits + 7) // 8
606 if isinstance(image_var, ids_peak_ipl.Image):
607 return Image.create_from_ids_peak_ipl_image(image_var)
A size consists of width and height where width and height have to be greater than or equal to zero.
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 an instance to a file on disk.
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.
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 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.
Thrown when a value is outside the allowed 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)