libtuning: Backport improvements in MacBeth search reliability

Port commit 66479605ba ("utils: raspberrypi: ctt: Improve the Macbeth
Chart search reliability") into libtuning.

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>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Stefan Klug 2024-04-18 15:04:01 +02:00
parent 131039f633
commit f119d6f048

View file

@ -403,10 +403,15 @@ def find_macbeth(img, mac_config):
# nothing more is tried as this is a high enough confidence to ensure # nothing more is tried as this is a high enough confidence to ensure
# reliable macbeth square centre placement. # 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]: for brightness in [2, 4]:
if cor >= 0.75: if cor >= 0.75:
break break
img_br = cv2.convertScaleAbs(img, alpha=brightness, beta=0) 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) cor_b, mac_b, coords_b, ret_b = get_macbeth_chart(img_br, ref_data)
if cor_b > cor: if cor_b > cor:
cor, mac, coords, ret = cor_b, mac_b, coords_b, ret_b 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']) w_inc = int(w * pair['inc'])
h_inc = int(h * 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 each subselection, look for a macbeth chart
for i in range(loop): for img_br in all_images:
for j in range(loop): for i in range(loop):
w_s, h_s = i * w_inc, j * h_inc for j in range(loop):
img_sel = img[w_s:w_s + w_sel, h_s:h_s + h_sel] w_s, h_s = i * w_inc, j * h_inc
cor_ij, mac_ij, coords_ij, ret_ij = get_macbeth_chart(img_sel, ref_data) 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 # If the correlation is better than the best then record the
# scale and current subselection at which macbeth chart was # scale and current subselection at which macbeth chart was
# found. Also record the coordinates, macbeth chart and message. # found. Also record the coordinates, macbeth chart and message.
if cor_ij > cor: if cor_ij > cor:
cor = cor_ij cor = cor_ij
mac, coords, ret = mac_ij, coords_ij, ret_ij mac, coords, ret = mac_ij, coords_ij, ret_ij
ii, jj = i, j ii, jj = i, j
w_best, h_best = w_inc, h_inc w_best, h_best = w_inc, h_inc
d_best = index + 1 d_best = index + 1
# Transform coordinates from subselection to original image # Transform coordinates from subselection to original image
if ii != -1: if ii != -1: