import cv2
import numpy as np
import os

def split_dictionary_entries(image_path, output_folder="output_entries"):
    # 1. 读取图片
    img = cv2.imread(image_path)
    if img is None:
        print(f"Error: 无法找到图片 {image_path}")
        return

    # 创建输出文件夹
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 2. 转换颜色空间 BGR -> HSV
    # HSV 更容易提取特定颜色
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 3. 定义绿色的范围 (根据截图的颜色特征调整)
    # OpenCV中 H: 0-179, S: 0-255, V: 0-255
    # 截图中的绿色偏深，接近青色(Teal)
    lower_green = np.array([35, 50, 50])   # 颜色下限
    upper_green = np.array([95, 255, 255]) # 颜色上限

    # 创建掩膜 (Mask)，只有绿色部分是白色的，其他是黑的
    mask = cv2.inRange(hsv, lower_green, upper_green)

    # 4. 形态学操作 (优化)
    # 这一步是为了把同一个词中的字母连成一个块 (例如 "A, a" 变成一个整体)
    # 主要是横向膨胀
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 3))
    dilated = cv2.dilate(mask, kernel, iterations=1)

    # 5. 寻找轮廓 (Contours)
    contours, _ = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 获取所有绿色块的边界框 (x, y, w, h)
    bounding_boxes = [cv2.boundingRect(c) for c in contours]

    # 6. 筛选和排序
    # 过滤掉太小的噪点 (例如高度小于10像素的斑点)
    valid_boxes = [b for b in bounding_boxes if b[3] > 10 and b[2] > 10]
    
    # 按 Y轴 (垂直位置) 从上到下排序
    valid_boxes.sort(key=lambda x: x[1])

    # 7. 确定切割点
    # 我们只需要每个词条的起始 Y 坐标
    cut_points = []
    
    # 为了防止同一行有多个绿色块导致重复切割（虽然字典通常一行只有一个词头），
    # 我们做一个简单的去重：如果两个切点距离太近，视为同一行
    last_y = -100
    for (x, y, w, h) in valid_boxes:
        if abs(y - last_y) > 20: # 如果垂直距离大于20像素，视为新的一行
            cut_points.append(y)
            last_y = y

    print(f"检测到 {len(cut_points)} 个词条。")

    # 8. 执行切割并保存
    img_height = img.shape[0]
    
    for i in range(len(cut_points)):
        y_start = cut_points[i]
        
        # 这一条的结束位置，就是下一条的开始位置
        # 如果是最后一条，则一直切到底部
        if i == len(cut_points) - 1:
            y_end = img_height
        else:
            y_end = cut_points[i+1]
        
        # 稍微向上调整一点 start，向下调整一点 end，避免切到文字边缘
        # (可选微调)
        y_start = max(0, y_start - 5) 
        
        # 切片 (Slicing)
        entry_img = img[y_start:y_end, :]
        
        # 保存
        output_filename = os.path.join(output_folder, f"entry_{(i+1)*10:04d}.png")
        cv2.imwrite(output_filename, entry_img)
        print(f"已保存: {output_filename}")

# --- 运行脚本 ---
# 将 'Screenshot2.jpg' 替换为你的文件名
split_dictionary_entries('x-00001.png')
