[v2,01/25] libtuning: Backport improvements in MacBeth search reliability
diff mbox series

Message ID 20240628104828.2928109-2-stefan.klug@ideasonboard.com
State Superseded
Headers show
Series
  • Add ccm calibration to libtuning
Related show

Commit Message

Stefan Klug June 28, 2024, 10:46 a.m. UTC
Port 66479605baca4a22e2b7a17c2a8cf9f9be9a7724 into libtuning.
Original message:
Improve the Macbeth Chart search reliability

Previously the code would brighten up images in case the Macbeth Chart
is slightly dark, and also zoom in on sections of it to look for
charts occupying less of the field of view. But it would not do both
together.

This change makes the search for smaller charts also repeat that
search for the brightened up images that it made earlier, thereby
increasing the chances of success for non-optimal tuning images.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
---
 utils/tuning/libtuning/macbeth.py | 38 ++++++++++++++++++-------------
 1 file changed, 22 insertions(+), 16 deletions(-)

Comments

Kieran Bingham June 28, 2024, 10:51 a.m. UTC | #1
Quoting Stefan Klug (2024-06-28 11:46:54)
> Port 66479605baca4a22e2b7a17c2a8cf9f9be9a7724 into libtuning.
> Original message:
> Improve the Macbeth Chart search reliability
> 
> Previously the code would brighten up images in case the Macbeth Chart
> is slightly dark, and also zoom in on sections of it to look for
> charts occupying less of the field of view. But it would not do both
> together.
> 
> This change makes the search for smaller charts also repeat that
> search for the brightened up images that it made earlier, thereby
> increasing the chances of success for non-optimal tuning images.
> 
> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>


Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

> ---
>  utils/tuning/libtuning/macbeth.py | 38 ++++++++++++++++++-------------
>  1 file changed, 22 insertions(+), 16 deletions(-)
> 
> diff --git a/utils/tuning/libtuning/macbeth.py b/utils/tuning/libtuning/macbeth.py
> index e11824646a4f..81f3e87c9088 100644
> --- a/utils/tuning/libtuning/macbeth.py
> +++ b/utils/tuning/libtuning/macbeth.py
> @@ -403,10 +403,15 @@ def find_macbeth(img, mac_config):
>      # nothing more is tried as this is a high enough confidence to ensure
>      # reliable macbeth square centre placement.
>  
> +    # Keep a list that will include this and any brightened up versions of
> +    # the image for reuse.
> +    all_images = [img]
> +
>      for brightness in [2, 4]:
>          if cor >= 0.75:
>              break
>          img_br = cv2.convertScaleAbs(img, alpha=brightness, beta=0)
> +        all_images.append(img_br)
>          cor_b, mac_b, coords_b, ret_b = get_macbeth_chart(img_br, ref_data)
>          if cor_b > cor:
>              cor, mac, coords, ret = cor_b, mac_b, coords_b, ret_b
> @@ -456,23 +461,24 @@ def find_macbeth(img, mac_config):
>          w_inc = int(w * pair['inc'])
>          h_inc = int(h * pair['inc'])
>  
> -        loop = ((1 - pair['sel']) / pair['inc']) + 1
> +        loop = int(((1 - pair['sel']) / pair['inc']) + 1)
>          # For each subselection, look for a macbeth chart
> -        for i in range(loop):
> -            for j in range(loop):
> -                w_s, h_s = i * w_inc, j * h_inc
> -                img_sel = img[w_s:w_s + w_sel, h_s:h_s + h_sel]
> -                cor_ij, mac_ij, coords_ij, ret_ij = get_macbeth_chart(img_sel, ref_data)
> -
> -                # If the correlation is better than the best then record the
> -                # scale and current subselection at which macbeth chart was
> -                # found. Also record the coordinates, macbeth chart and message.
> -                if cor_ij > cor:
> -                    cor = cor_ij
> -                    mac, coords, ret = mac_ij, coords_ij, ret_ij
> -                    ii, jj = i, j
> -                    w_best, h_best = w_inc, h_inc
> -                    d_best = index + 1
> +        for img_br in all_images:
> +            for i in range(loop):
> +                for j in range(loop):
> +                    w_s, h_s = i * w_inc, j * h_inc
> +                    img_sel = img_br[w_s:w_s + w_sel, h_s:h_s + h_sel]
> +                    cor_ij, mac_ij, coords_ij, ret_ij = get_macbeth_chart(img_sel, ref_data)
> +
> +                    # If the correlation is better than the best then record the
> +                    # scale and current subselection at which macbeth chart was
> +                    # found. Also record the coordinates, macbeth chart and message.
> +                    if cor_ij > cor:
> +                        cor = cor_ij
> +                        mac, coords, ret = mac_ij, coords_ij, ret_ij
> +                        ii, jj = i, j
> +                        w_best, h_best = w_inc, h_inc
> +                        d_best = index + 1
>  
>      # Transform coordinates from subselection to original image
>      if ii != -1:
> -- 
> 2.43.0
>

Patch
diff mbox series

diff --git a/utils/tuning/libtuning/macbeth.py b/utils/tuning/libtuning/macbeth.py
index e11824646a4f..81f3e87c9088 100644
--- a/utils/tuning/libtuning/macbeth.py
+++ b/utils/tuning/libtuning/macbeth.py
@@ -403,10 +403,15 @@  def find_macbeth(img, mac_config):
     # nothing more is tried as this is a high enough confidence to ensure
     # reliable macbeth square centre placement.
 
+    # Keep a list that will include this and any brightened up versions of
+    # the image for reuse.
+    all_images = [img]
+
     for brightness in [2, 4]:
         if cor >= 0.75:
             break
         img_br = cv2.convertScaleAbs(img, alpha=brightness, beta=0)
+        all_images.append(img_br)
         cor_b, mac_b, coords_b, ret_b = get_macbeth_chart(img_br, ref_data)
         if cor_b > cor:
             cor, mac, coords, ret = cor_b, mac_b, coords_b, ret_b
@@ -456,23 +461,24 @@  def find_macbeth(img, mac_config):
         w_inc = int(w * pair['inc'])
         h_inc = int(h * pair['inc'])
 
-        loop = ((1 - pair['sel']) / pair['inc']) + 1
+        loop = int(((1 - pair['sel']) / pair['inc']) + 1)
         # For each subselection, look for a macbeth chart
-        for i in range(loop):
-            for j in range(loop):
-                w_s, h_s = i * w_inc, j * h_inc
-                img_sel = img[w_s:w_s + w_sel, h_s:h_s + h_sel]
-                cor_ij, mac_ij, coords_ij, ret_ij = get_macbeth_chart(img_sel, ref_data)
-
-                # If the correlation is better than the best then record the
-                # scale and current subselection at which macbeth chart was
-                # found. Also record the coordinates, macbeth chart and message.
-                if cor_ij > cor:
-                    cor = cor_ij
-                    mac, coords, ret = mac_ij, coords_ij, ret_ij
-                    ii, jj = i, j
-                    w_best, h_best = w_inc, h_inc
-                    d_best = index + 1
+        for img_br in all_images:
+            for i in range(loop):
+                for j in range(loop):
+                    w_s, h_s = i * w_inc, j * h_inc
+                    img_sel = img_br[w_s:w_s + w_sel, h_s:h_s + h_sel]
+                    cor_ij, mac_ij, coords_ij, ret_ij = get_macbeth_chart(img_sel, ref_data)
+
+                    # If the correlation is better than the best then record the
+                    # scale and current subselection at which macbeth chart was
+                    # found. Also record the coordinates, macbeth chart and message.
+                    if cor_ij > cor:
+                        cor = cor_ij
+                        mac, coords, ret = mac_ij, coords_ij, ret_ij
+                        ii, jj = i, j
+                        w_best, h_best = w_inc, h_inc
+                        d_best = index + 1
 
     # Transform coordinates from subselection to original image
     if ii != -1: