DefectivePixelCorrection#

from itala import itala

def CorrectDetectedPixels(defective_pixels, node_map):
    defective_pixel_count_node = node_map.get_node("oeDefectivePixelCount")
    if(not itala.is_writable(defective_pixel_count_node)):
        print("Unable to configure eDefectivePixelCount. Aborting,")
        exit(1)
    defective_pixel_count_node.value = len(defective_pixels)
    print("Correction procedure started with "+str(len(defective_pixels))+" pixels")

    defective_pixel_selector_node = node_map.get_node("oeDefectivePixelSelector")
    if(not itala.is_writable(defective_pixel_selector_node)):
        print("Unable to configure oeDefectivePixelSelector. Aborting,")
        exit(1)

    defective_pixel_coordinate_x_node = node_map.get_node("oeDefectivePixelXCoordinate")
    if(not itala.is_writable(defective_pixel_coordinate_x_node)):
        print("Unable to configure oeDefectivePixelXCoordinate. Aborting,")
        exit(1)
    defective_pixel_coordinate_y_node = node_map.get_node("oeDefectivePixelYCoordinate")
    if(not itala.is_writable(defective_pixel_coordinate_x_node)):
        print("Unable to configure oeDefectivePixelYCoordinate. Aborting,")
        exit(1)

    for i in range(len(defective_pixels)):
        defective_pixel_selector_node.value = i
        defective_pixel_coordinate_x_node.value = defective_pixels[i].x()
        defective_pixel_coordinate_y_node.value = defective_pixels[i].y()

        print("Pixel ["+str(defective_pixels[i].x())+","+str(defective_pixels[i].y())+"] registered for correction. Was "+str(defective_pixels[i].type_string()+"."))

    defective_pixel_write_map_node = node_map.get_node("oeDefectivePixelWriteMap")
    if(not itala.is_writable(defective_pixel_write_map_node)):
        print("Unable to configure oeDefectivePixelWriteMap. Aborting,")
        exit(1)
    defective_pixel_write_map_node.execute()

    print("Correction command sent, procedure completed.")


system = itala.create_system()
devices_info = system.enumerate_devices(500)
if(len(devices_info) == 0):
    print("No devices found. Example canceled.")
    exit(1)
if(devices_info[0].access_status != itala.DeviceAccessStatus_AvailableReadWrite):
    print("Target device is unaccessible in RW mode. Example cancelled.")
    exit(1)
device = system.create_device(devices_info[0])
print("First device initialized.")
nodemap = device.node_map

# Start by setting a full resolution Mono8 image to perform the
# correction on the whole sensor. Keep the original values to 
# restore the initial camera state at the end of the program.
width_node = nodemap.Width
if(not itala.is_writable(width_node)):
    print("Unable to configure the image width. Aborting.")
    exit(1)
width_original = width_node.value
width_node.value = width_node.max
print("Image width set to max.")

height_node = nodemap.Height
if(not itala.is_writable(height_node)):
    print("Unable to configure the image height. Aborting,")
    exit(1)
height_original = height_node.value
height_node.value = height_node.max
print("Image height set to max.")

pixel_format_node = nodemap.PixelFormat
if(not itala.is_writable(pixel_format_node)):
    print("Unable to configure the image PixelFormat. Aborting,")
    exit(1)
pixel_format_original = pixel_format_node.get_int_value()
mono8_entry = pixel_format_node.get_entry_by_name("Mono8")
mono8_format = mono8_entry.value
pixel_format_node.set_int_value(mono8_format)
print("Pixel format se to Mono8")

mono8_detection = itala.create_defect_detection(width_node.max, height_node.max, itala.PixelDepth_d8Bit)

device.start_acquisition()
print("Acquisition started")
for i in range(10):
    dark_image = device.get_next_image(500)
    buffer = dark_image.get_data()
    buff = itala.buffer.frompointer(buffer)
    mono8_detection.accumulate_dark(buff.cast())
    print("Accumulating dark: image "+str(i+1)+" added.", end="\r")
    dark_image.dispose()

for i in range(10):
    dark_image = device.get_next_image(500)
    buffer = dark_image.get_data()
    buff = itala.buffer.frompointer(buffer)
    mono8_detection.accumulate_gray(buff.cast())
    print("Accumulating grey: image "+str(i+1)+" added.", end="\r")
    dark_image.dispose()

device.stop_acquisition()
print("Acquisition stopped")

leaky_pixel = mono8_detection.find_leaky(1024, 5)
hot_n_cold_pixel = mono8_detection.find_hot_ncold(1024, 5)
print(leaky_pixel)
print(str(leaky_pixel.size())+" leaky pixels found.")
print(str(hot_n_cold_pixel.size())+" hot/cold pixels found.")

if leaky_pixel.size()>0:
    CorrectDetectedPixels(leaky_pixel, nodemap)
if hot_n_cold_pixel.size()>0:
   CorrectDetectedPixels(hot_n_cold_pixel, nodemap)

mono8_detection.dispose()
print("Mono8 detection instance disposed")
width_node.value = width_original
height_node.value = height_original
pixel_format_node.set_int_value(pixel_format_original)

device.dispose()
system.dispose()