我可以做到,但你上傳的是一張靜態影像(單一畫格)。
若要「分拆 GIF 並列出變紅球裡的字母」,請上傳原始 GIF 動畫檔;
我就能直接替你跑分析。
先給你本地操作的做法:
一、把 GIF 分拆成多張圖片 - 使用 ffmpeg - 建資料夾 frames - 指令:ffmpeg -i input.gif -vsync 0 frames/frame_%03d.png - 或使用 ImageMagick - 指令:magick input.gif -coalesce frames/frame_%03d.png 二、自動找出變紅的球,並讀取球內字母(Python) 前置: - 安裝套件:pip install opencv-python numpy pytesseract pillow - 安裝 Tesseract OCR - macOS: brew install tesseract - Ubuntu: sudo apt-get install tesseract-ocr - Windows: 安裝程式並把 tesseract.exe 路徑加到 PATH 程式(將它存為 find_red_letters.py;frames 內已是分拆後的 PNG): - 這段會: 1) 用第一張畫格找出 4×4 的圓位置並對每個圓做一次 OCR,得到每個格子的字母 2) 逐格逐畫格檢查是否變成紅色 3) 列出「首次變紅的順序」與「所有曾變紅的字母(去重)」;並輸出標註圖以便確認 from pathlib import Path import cv2, numpy as np, pytesseract frames_dir = Path("frames") frame_files = sorted(frames_dir.glob("frame_*.png")) assert frame_files, "frames 資料夾是空的" def read_img(p): return cv2.imread(str(p), cv2.IMREAD_COLOR) # 1) 在第一張畫格找 4×4 圓位置(用霍夫圓或以格點自動分群) first = read_img(frame_files[0]) gray = cv2.cvtColor(first, cv2.COLOR_BGR2GRAY) gray = cv2.medianBlur(gray, 5) # 依影像大小,調整 param1/param2/minRadius/maxRadius circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1.2, minDist=first.shape[1]//8, param1=120, param2=40, minRadius=first.shape[1]//16, maxRadius=first.shape[1]//6) assert circles is not None and len(circles[0])>=16, "找不到足夠的圓,請調整霍夫參數" # 取前 16 顆,並依 y 再 x 排序,成 4x4 circs = np.round(circles[0][:, :3]).astype(int) # (x,y,r) circs = sorted(circs, key=lambda c:(c[1], c[0])) # 分成 4 列後各列再依 x 排序,避免 y 軸微抖動 rows = [sorted(circs[i*4:(i+1)*4], key=lambda c:c[0]) for i in range(4)] circs = [c for row in rows for c in row] # 依格序 0..15 # 2) 先在第一張畫格 OCR 出每個圓的字母 def crop_circle(img, x,y,r, pad=0.85): rr = int(r*pad) y1,y2 = max(0,y-rr), min(img.shape[0], y+rr) x1,x2 = max(0,x-rr), min(img.shape[1], x+rr) crop = img[y1:y2, x1:x2] mask = np.zeros(crop.shape[:2], np.uint8) cv2.circle(mask, (crop.shape[1]//2, crop.shape[0]//2), rr, 255, -1) bg = np.full_like(crop, 255) crop = np.where(mask[...,None]==255, crop, bg) # 圓外白底 return crop letters = [] for (x,y,r) in circs: patch = crop_circle(first, x,y,r) grayp = cv2.cvtColor(patch, cv2.COLOR_BGR2GRAY) grayp = cv2.threshold(grayp, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1] # 單字母識別 config = "--psm 10 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ" txt = pytesseract.image_to_string(grayp, config=config).strip().upper() if not txt: txt = "?" letters.append(txt) # 3) 逐畫格偵測該圓是否為紅色(HSV 兩段紅) def is_red_circle(img, x,y,r): patch = crop_circle(img, x,y,r) hsv = cv2.cvtColor(patch, cv2.COLOR_BGR2HSV) lower1 = np.array([0, 80, 80]); upper1 = np.array([10,255,255]) lower2 = np.array([170,80,80]); upper2 = np.array([180,255,255]) mask = cv2.inRange(hsv, lower1, upper1) | cv2.inRange(hsv, lower2, upper2) # 只統計圓內 circle_mask = np.zeros(mask.shape, np.uint8) rr = min(patch.shape[0], patch.shape[1])//2 cv2.circle(circle_mask, (patch.shape[1]//2, patch.shape[0]//2), rr, 255, -1) ratio = (mask & circle_mask).sum() / (circle_mask.sum()+1e-6) return ratio > 0.35 # 門檻可依實際調整 first_time_red = [] # 依首次變紅順序 seen = set() red_map = {i:[] for i in range(16)} # 每格在哪些畫格紅 for fi, fpath in enumerate(frame_files): img = read_img(fpath) turned = [] for i,(x,y,r) in enumerate(circs): if is_red_circle(img, x,y,r): red_map[i].append(fi) if i not in seen: seen.add(i) first_time_red.append((fi, i, letters[i])) turned.append(i) # 可選:輸出標註影像檢查 if turned: vis = img.copy() for i in turned: x,y,r = circs[i] cv2.circle(vis, (x,y), r, (0,0,255), 4) cv2.putText(vis, letters[i], (x-r, y-r), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0,0,255), 3) cv2.imwrite(str(frames_dir / f"annot_{fi:03d}.png"), vis) first_time_red.sort(key=lambda t:t[0]) # 依畫格順序 ordered_letters = [t[2] for t in first_time_red] unique_letters = sorted({t[2] for t in first_time_red}) print("首次變紅順序的字母:", "".join(ordered_letters)) print("曾變紅(去重)字母集合:", "".join(unique_letters)) print("各格位置對應字母(從上到下、左到右 4x4):", letters) 使用說明與調參: - 若找不到 16 顆圓,調整 Hough 圓參數 minDist、param2、minRadius、maxRadius。 - 若紅色偵測過嚴或過鬆,調整 HSV 門檻與 ratio 門檻(0.35)。 - Tesseract 若誤判,可把第一張畫格的 letters 改成你人工校正的字母清單,之後只靠顏色判斷即可。 附註:在你上傳的單張畫格中,4×4 的字母為: C O D E D E D K H C Y Q A M P V 但哪些有「變紅」必須看 GIF 動畫;請把 GIF 檔傳上來,我可以直接幫你跑出結果並列出紅球字母。