@@ -439,6 +439,7 @@ <h1>Source code for src.cytodataframe.frame</h1><div class="highlight"><pre>
439439 < span class ="n "> adjust_with_adaptive_histogram_equalization</ span > < span class ="p "> ,</ span >
440440 < span class ="n "> draw_outline_on_image_from_mask</ span > < span class ="p "> ,</ span >
441441 < span class ="n "> draw_outline_on_image_from_outline</ span > < span class ="p "> ,</ span >
442+ < span class ="n "> get_pixel_bbox_from_offsets</ span > < span class ="p "> ,</ span >
442443< span class ="p "> )</ span >
443444
444445< span class ="n "> logger</ span > < span class ="o "> =</ span > < span class ="n "> logging</ span > < span class ="o "> .</ span > < span class ="n "> getLogger</ span > < span class ="p "> (</ span > < span class ="vm "> __name__</ span > < span class ="p "> )</ span >
@@ -535,6 +536,13 @@ <h1>Source code for src.cytodataframe.frame</h1><div class="highlight"><pre>
535536< span class ="sd "> - 'center_dot': Whether to draw a red dot at the compartment center</ span >
536537< span class ="sd "> None will default to display a center dot.</ span >
537538< span class ="sd "> e.g. {'center_dot': True} to draw a red dot at the compartment center.</ span >
539+ < span class ="sd "> - 'offset_bounding_box': declare a relative bounding box using</ span >
540+ < span class ="sd "> the nuclei center xy coordinates to dynamically crop all images</ span >
541+ < span class ="sd "> by offsets from the center of the bounding box.</ span >
542+ < span class ="sd "> (overriding the bounding box data from the dataframe).</ span >
543+ < span class ="sd "> e.g. {'bounding_box':</ span >
544+ < span class ="sd "> {'x_min': -100, 'y_min': -100, 'x_max': 100, 'y_max': 100}</ span >
545+ < span class ="sd "> }</ span >
538546< span class ="sd "> **kwargs:</ span >
539547< span class ="sd "> Additional keyword arguments to pass to the pandas read functions.</ span >
540548< span class ="sd "> """</ span >
@@ -1437,7 +1445,42 @@ <h1>Source code for src.cytodataframe.frame</h1><div class="highlight"><pre>
14371445
14381446 < span class ="c1 "> # Step 6: Crop the image based on the bounding box and encode it to PNG format</ span >
14391447 < span class ="k "> try</ span > < span class ="p "> :</ span >
1440- < span class ="n "> x_min</ span > < span class ="p "> ,</ span > < span class ="n "> y_min</ span > < span class ="p "> ,</ span > < span class ="n "> x_max</ span > < span class ="p "> ,</ span > < span class ="n "> y_max</ span > < span class ="o "> =</ span > < span class ="nb "> map</ span > < span class ="p "> (</ span > < span class ="nb "> int</ span > < span class ="p "> ,</ span > < span class ="n "> bounding_box</ span > < span class ="p "> )</ span > < span class ="c1 "> # Ensure integers</ span >
1448+ < span class ="c1 "> # set a default bounding box</ span >
1449+ < span class ="n "> x_min</ span > < span class ="p "> ,</ span > < span class ="n "> y_min</ span > < span class ="p "> ,</ span > < span class ="n "> x_max</ span > < span class ="p "> ,</ span > < span class ="n "> y_max</ span > < span class ="o "> =</ span > < span class ="nb "> map</ span > < span class ="p "> (</ span > < span class ="nb "> int</ span > < span class ="p "> ,</ span > < span class ="n "> bounding_box</ span > < span class ="p "> )</ span >
1450+
1451+ < span class ="c1 "> # if we have custom offset bounding box information, use it</ span >
1452+ < span class ="k "> if</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _custom_attrs</ span > < span class ="o "> .</ span > < span class ="n "> get</ span > < span class ="p "> (</ span > < span class ="s2 "> "display_options"</ span > < span class ="p "> ,</ span > < span class ="kc "> None</ span > < span class ="p "> )</ span > < span class ="ow "> and</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _custom_attrs</ span > < span class ="p "> [</ span >
1453+ < span class ="s2 "> "display_options"</ span >
1454+ < span class ="p "> ]</ span > < span class ="o "> .</ span > < span class ="n "> get</ span > < span class ="p "> (</ span > < span class ="s2 "> "offset_bounding_box"</ span > < span class ="p "> ,</ span > < span class ="kc "> None</ span > < span class ="p "> ):</ span >
1455+ < span class ="k "> try</ span > < span class ="p "> :</ span >
1456+ < span class ="c1 "> # note: this will default to the nuclei centers based</ span >
1457+ < span class ="c1 "> # on earlier input for this parameter.</ span >
1458+ < span class ="n "> center_x</ span > < span class ="p "> ,</ span > < span class ="n "> center_y</ span > < span class ="o "> =</ span > < span class ="nb "> map</ span > < span class ="p "> (</ span > < span class ="nb "> int</ span > < span class ="p "> ,</ span > < span class ="n "> compartment_center_xy</ span > < span class ="p "> )</ span >
1459+
1460+ < span class ="n "> offset_bounding_box</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _custom_attrs</ span > < span class ="p "> [</ span > < span class ="s2 "> "display_options"</ span > < span class ="p "> ]</ span > < span class ="o "> .</ span > < span class ="n "> get</ span > < span class ="p "> (</ span >
1461+ < span class ="s2 "> "offset_bounding_box"</ span >
1462+ < span class ="p "> )</ span >
1463+ < span class ="c1 "> # generate offset bounding box positions</ span >
1464+ < span class ="n "> x_min</ span > < span class ="p "> ,</ span > < span class ="n "> y_min</ span > < span class ="p "> ,</ span > < span class ="n "> x_max</ span > < span class ="p "> ,</ span > < span class ="n "> y_max</ span > < span class ="o "> =</ span > < span class ="n "> get_pixel_bbox_from_offsets</ span > < span class ="p "> (</ span >
1465+ < span class ="n "> center_x</ span > < span class ="o "> =</ span > < span class ="n "> center_x</ span > < span class ="p "> ,</ span >
1466+ < span class ="n "> center_y</ span > < span class ="o "> =</ span > < span class ="n "> center_y</ span > < span class ="p "> ,</ span >
1467+ < span class ="n "> rel_bbox</ span > < span class ="o "> =</ span > < span class ="p "> (</ span >
1468+ < span class ="n "> offset_bounding_box</ span > < span class ="p "> [</ span > < span class ="s2 "> "x_min"</ span > < span class ="p "> ],</ span >
1469+ < span class ="n "> offset_bounding_box</ span > < span class ="p "> [</ span > < span class ="s2 "> "y_min"</ span > < span class ="p "> ],</ span >
1470+ < span class ="n "> offset_bounding_box</ span > < span class ="p "> [</ span > < span class ="s2 "> "x_max"</ span > < span class ="p "> ],</ span >
1471+ < span class ="n "> offset_bounding_box</ span > < span class ="p "> [</ span > < span class ="s2 "> "y_max"</ span > < span class ="p "> ],</ span >
1472+ < span class ="p "> ),</ span >
1473+ < span class ="p "> )</ span >
1474+ < span class ="k "> except</ span > < span class ="ne "> IndexError</ span > < span class ="p "> :</ span >
1475+ < span class ="n "> logger</ span > < span class ="o "> .</ span > < span class ="n "> debug</ span > < span class ="p "> (</ span >
1476+ < span class ="p "> (</ span >
1477+ < span class ="s2 "> "Bounding box </ span > < span class ="si "> %s</ span > < span class ="s2 "> is out of bounds for image </ span > < span class ="si "> %s</ span > < span class ="s2 "> ."</ span >
1478+ < span class ="s2 "> " Defaulting to use bounding box from data."</ span >
1479+ < span class ="p "> ),</ span >
1480+ < span class ="p "> (</ span > < span class ="n "> x_min</ span > < span class ="p "> ,</ span > < span class ="n "> y_min</ span > < span class ="p "> ,</ span > < span class ="n "> x_max</ span > < span class ="p "> ,</ span > < span class ="n "> y_max</ span > < span class ="p "> ),</ span >
1481+ < span class ="n "> image_path</ span > < span class ="p "> ,</ span >
1482+ < span class ="p "> )</ span >
1483+
14411484 < span class ="n "> cropped_img_array</ span > < span class ="o "> =</ span > < span class ="n "> prepared_image</ span > < span class ="p "> [</ span >
14421485 < span class ="n "> y_min</ span > < span class ="p "> :</ span > < span class ="n "> y_max</ span > < span class ="p "> ,</ span > < span class ="n "> x_min</ span > < span class ="p "> :</ span > < span class ="n "> x_max</ span >
14431486 < span class ="p "> ]</ span > < span class ="c1 "> # Perform slicing</ span >
0 commit comments