프로젝트 분리 이동

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
minsung
2026-05-20 14:28:27 +09:00
commit ccba1266b5
24 changed files with 7900 additions and 0 deletions

72
tools/show_tiles.py Normal file
View File

@@ -0,0 +1,72 @@
"""
이미지를 cols×rows 타일로 분할하고 번호를 좌상단에 표시.
사용법:
python tools/show_tiles.py --input <이미지> --cols 8 --rows 6 --overlap 0.10
"""
import argparse
from pathlib import Path
import cv2
import numpy as np
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--input", required=True)
ap.add_argument("--output", default=None)
ap.add_argument("--cols", type=int, default=8)
ap.add_argument("--rows", type=int, default=6)
ap.add_argument("--overlap", type=float, default=0.10)
args = ap.parse_args()
img_path = Path(args.input)
buf = np.fromfile(str(img_path), dtype=np.uint8)
img = cv2.imdecode(buf, cv2.IMREAD_COLOR)
H, W = img.shape[:2]
base_w = W / args.cols
base_h = H / args.rows
pad_x = int(base_w * args.overlap)
pad_y = int(base_h * args.overlap)
vis = img.copy()
for r in range(args.rows):
for c in range(args.cols):
idx = r * args.cols + c + 1
x0 = max(0, int(c * base_w) - pad_x)
x1 = min(W, int((c + 1) * base_w) + pad_x)
y0 = max(0, int(r * base_h) - pad_y)
y1 = min(H, int((r + 1) * base_h) + pad_y)
# 타일 경계선 (기준선 = 중복 없는 경계)
bx0 = int(c * base_w)
by0 = int(r * base_h)
bx1 = min(W, int((c + 1) * base_w))
by1 = min(H, int((r + 1) * base_h))
cv2.rectangle(vis, (bx0, by0), (bx1, by1), (0, 200, 255), 3)
# 번호 좌상단
font_scale = max(0.8, min(W, H) / 3000)
thickness = max(2, int(font_scale * 3))
tx, ty = bx0 + 10, by0 + int(base_h * 0.12)
# 배경 박스
label = str(idx)
(tw, th), _ = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, font_scale * 2, thickness)
cv2.rectangle(vis, (tx - 4, ty - th - 4), (tx + tw + 4, ty + 4), (0, 0, 0), -1)
cv2.putText(vis, label, (tx, ty),
cv2.FONT_HERSHEY_SIMPLEX, font_scale * 2, (0, 200, 255), thickness, cv2.LINE_AA)
# 출력 크기 제한
h, w = vis.shape[:2]
if max(h, w) > 4096:
s = 4096 / max(h, w)
vis = cv2.resize(vis, (int(w * s), int(h * s)))
out = (Path(args.output) if args.output
else img_path.parent / (img_path.stem + "_tiles.jpg"))
cv2.imencode(".jpg", vis, [cv2.IMWRITE_JPEG_QUALITY, 92])[1].tofile(str(out))
print(f"저장: {out} ({args.cols}×{args.rows}={args.cols*args.rows}타일)")
if __name__ == "__main__":
main()