Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -469,27 +469,33 @@ def export_pdf(heatmap_img, chart_img, summary_md):
|
|
| 469 |
return pdf_path
|
| 470 |
|
| 471 |
|
| 472 |
-
def draw_scan_path(overlay_bgr, zones):
|
| 473 |
img = overlay_bgr.copy()
|
|
|
|
|
|
|
|
|
|
| 474 |
ordered = sorted(zones, key=lambda z: z["intensity_rank"])
|
| 475 |
for i in range(len(ordered) - 1):
|
| 476 |
pt1 = (ordered[i]["cx"], ordered[i]["cy"])
|
| 477 |
pt2 = (ordered[i + 1]["cx"], ordered[i + 1]["cy"])
|
| 478 |
-
cv2.arrowedLine(img, pt1, pt2, (0, 0, 0),
|
| 479 |
-
cv2.arrowedLine(img, pt1, pt2, (0, 255, 255),
|
| 480 |
return img
|
| 481 |
|
| 482 |
|
| 483 |
-
def draw_zone_labels(overlay_bgr, zones):
|
| 484 |
img = overlay_bgr.copy()
|
|
|
|
|
|
|
|
|
|
|
|
|
| 485 |
for i, z in enumerate(zones, 1):
|
| 486 |
cx, cy = z["cx"], z["cy"]
|
| 487 |
-
radius = 22
|
| 488 |
cv2.circle(img, (cx, cy), radius, (255, 255, 255), -1)
|
| 489 |
-
cv2.circle(img, (cx, cy), radius, (0, 0, 0),
|
| 490 |
text = str(i)
|
| 491 |
-
(tw, th), _ = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX,
|
| 492 |
-
cv2.putText(img, text, (cx - tw // 2, cy + th // 2), cv2.FONT_HERSHEY_SIMPLEX,
|
| 493 |
return img
|
| 494 |
|
| 495 |
|
|
@@ -512,8 +518,8 @@ def analyze(pil_image, overlay_strength):
|
|
| 512 |
tips = generate_recommendations(saliency_map, scores, read, h, w)
|
| 513 |
chart_image = create_score_chart(scores['focus_score'], scores['spread_score'], readability_score)
|
| 514 |
|
| 515 |
-
overlay_bgr = draw_scan_path(overlay_bgr, zones)
|
| 516 |
-
overlay_bgr = draw_zone_labels(overlay_bgr, zones)
|
| 517 |
overlay_bgr = draw_issue_markers(overlay_bgr, read.get("issue_boxes", []))
|
| 518 |
overlay_rgb = cv2.cvtColor(overlay_bgr, cv2.COLOR_BGR2RGB)
|
| 519 |
|
|
|
|
| 469 |
return pdf_path
|
| 470 |
|
| 471 |
|
| 472 |
+
def draw_scan_path(overlay_bgr, zones, img_h, img_w):
|
| 473 |
img = overlay_bgr.copy()
|
| 474 |
+
scale = max(1.0, min(img_h, img_w) / 800.0)
|
| 475 |
+
outer_thickness = int(8 * scale)
|
| 476 |
+
inner_thickness = int(4 * scale)
|
| 477 |
ordered = sorted(zones, key=lambda z: z["intensity_rank"])
|
| 478 |
for i in range(len(ordered) - 1):
|
| 479 |
pt1 = (ordered[i]["cx"], ordered[i]["cy"])
|
| 480 |
pt2 = (ordered[i + 1]["cx"], ordered[i + 1]["cy"])
|
| 481 |
+
cv2.arrowedLine(img, pt1, pt2, (0, 0, 0), outer_thickness, tipLength=0.08, line_type=cv2.LINE_AA)
|
| 482 |
+
cv2.arrowedLine(img, pt1, pt2, (0, 255, 255), inner_thickness, tipLength=0.08, line_type=cv2.LINE_AA)
|
| 483 |
return img
|
| 484 |
|
| 485 |
|
| 486 |
+
def draw_zone_labels(overlay_bgr, zones, img_h, img_w):
|
| 487 |
img = overlay_bgr.copy()
|
| 488 |
+
scale = max(1.0, min(img_h, img_w) / 800.0)
|
| 489 |
+
radius = int(22 * scale)
|
| 490 |
+
font_scale = 0.9 * scale
|
| 491 |
+
thickness = max(2, int(3 * scale))
|
| 492 |
for i, z in enumerate(zones, 1):
|
| 493 |
cx, cy = z["cx"], z["cy"]
|
|
|
|
| 494 |
cv2.circle(img, (cx, cy), radius, (255, 255, 255), -1)
|
| 495 |
+
cv2.circle(img, (cx, cy), radius, (0, 0, 0), thickness)
|
| 496 |
text = str(i)
|
| 497 |
+
(tw, th), _ = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, font_scale, thickness)
|
| 498 |
+
cv2.putText(img, text, (cx - tw // 2, cy + th // 2), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 0, 0), thickness, cv2.LINE_AA)
|
| 499 |
return img
|
| 500 |
|
| 501 |
|
|
|
|
| 518 |
tips = generate_recommendations(saliency_map, scores, read, h, w)
|
| 519 |
chart_image = create_score_chart(scores['focus_score'], scores['spread_score'], readability_score)
|
| 520 |
|
| 521 |
+
overlay_bgr = draw_scan_path(overlay_bgr, zones, h, w)
|
| 522 |
+
overlay_bgr = draw_zone_labels(overlay_bgr, zones, h, w)
|
| 523 |
overlay_bgr = draw_issue_markers(overlay_bgr, read.get("issue_boxes", []))
|
| 524 |
overlay_rgb = cv2.cvtColor(overlay_bgr, cv2.COLOR_BGR2RGB)
|
| 525 |
|