"""
二值化测试程序 - 用于词典图像处理

功能：
1. 加载词典页面图像
2. 应用不同参数组合的自适应二值化
3. 保存每种参数组合的二值化结果
4. 提供参数调整界面

安装依赖（使用清华源）:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python numpy

使用方法:
1. 将词典页面保存为dictionary_page.jpg
2. 运行程序: python binarization_tester.py
3. 查看生成的二值化测试图像
"""

import cv2
import numpy as np
import os

def test_binarization(image_path, output_dir="binarization_tests"):
    """
    测试不同二值化参数组合
    :param image_path: 词典页面图片路径
    :param output_dir: 输出目录
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)
    
    # 1. 图像加载
    print(f"加载图像: {image_path}")
    image = cv2.imread(image_path)
    if image is None:
        raise ValueError(f"无法加载图像: {image_path}")
    
    # 转换为灰度图
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 2. 定义测试参数组合
    # 块大小参数列表
    block_sizes = [11, 13, 15, 17, 19, 21]
    
    # 常数C参数列表
    constants = [20]
    
    # 3. 生成并保存二值化结果
    print("生成二值化测试图像...")
    results = []
    
    # 原始图像和灰度图
    cv2.imwrite(os.path.join(output_dir, "00_original.jpg"), image)
    cv2.imwrite(os.path.join(output_dir, "01_gray.jpg"), gray)
    results.append(("原始图像", "00_original.jpg"))
    results.append(("灰度图", "01_gray.jpg"))
    
    # 测试不同参数组合
    for bs in block_sizes:
        for c in constants:
            # 应用自适应二值化
            binary = cv2.adaptiveThreshold(
                gray, 255,
                cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                cv2.THRESH_BINARY_INV, bs, c
            )
            
            # 保存结果
            filename = f"binary_bs{bs}_c{c}.jpg"
            filepath = os.path.join(output_dir, filename)
            cv2.imwrite(filepath, binary)
            
            # 记录结果
            results.append((f"块大小={bs}, C={c}", filename))
    
    # 4. 生成结果报告
    report_path = os.path.join(output_dir, "results_report.txt")
    with open(report_path, "w") as f:
        f.write("二值化测试结果报告\n")
        f.write("=" * 50 + "\n")
        f.write(f"原始图像: {image_path}\n")
        f.write(f"图像尺寸: {gray.shape[1]}x{gray.shape[0]} 像素\n")
        f.write(f"测试参数组合数: {len(block_sizes)} x {len(constants)} = {len(block_sizes)*len(constants)}\n")
        f.write("\n参数说明:\n")
        f.write("1. 块大小 (blockSize): 计算局部阈值的邻域大小，必须是奇数\n")
        f.write("2. 常数 (C): 从计算出的阈值中减去的常数\n")
        f.write("\n推荐参数组合:\n")
        f.write(" - 标准词典: 块大小=15, C=5\n")
        f.write(" - 模糊文字: 块大小=13, C=8\n")
        f.write(" - 高噪点: 块大小=17, C=3\n")
        f.write(" - 光照不均: 块大小=21, C=5\n")
        
        f.write("\n测试结果列表:\n")
        for desc, filename in results:
            f.write(f"{filename}: {desc}\n")
    
    print(f"\n测试完成! 共生成 {len(results)} 张测试图像")
    print(f"结果保存在 {output_dir} 目录")
    print(f"详细报告见: {report_path}")

def quick_test(image_path):
    """
    快速测试：使用推荐参数生成二值化图像
    :param image_path: 词典页面图片路径
    """
    # 加载图像
    image = cv2.imread(image_path)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 标准推荐参数
    binary_std = cv2.adaptiveThreshold(
        gray, 255,
        cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
        cv2.THRESH_BINARY_INV, 15, 5
    )
    
    # 模糊文字优化参数
    binary_blur = cv2.adaptiveThreshold(
        gray, 255,
        cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
        cv2.THRESH_BINARY_INV, 13, 8
    )
    
    # 高噪点优化参数
    binary_noise = cv2.adaptiveThreshold(
        gray, 255,
        cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
        cv2.THRESH_BINARY_INV, 17, 3
    )
    
    # 光照不均优化参数
    binary_light = cv2.adaptiveThreshold(
        gray, 255,
        cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
        cv2.THRESH_BINARY_INV, 21, 5
    )
    
    # 保存结果
    cv2.imwrite("quick_test_original.jpg", image)
    cv2.imwrite("quick_test_std.jpg", binary_std)
    cv2.imwrite("quick_test_blur.jpg", binary_blur)
    cv2.imwrite("quick_test_noise.jpg", binary_noise)
    cv2.imwrite("quick_test_light.jpg", binary_light)
    
    print("快速测试完成! 生成5张测试图像:")
    print(" - quick_test_original.jpg: 原始图像")
    print(" - quick_test_std.jpg: 标准参数 (块大小=15, C=5)")
    print(" - quick_test_blur.jpg: 模糊文字优化 (块大小=13, C=8)")
    print(" - quick_test_noise.jpg: 高噪点优化 (块大小=17, C=3)")
    print(" - quick_test_light.jpg: 光照不均优化 (块大小=21, C=5)")

if __name__ == "__main__":
    # 输入图像路径
    input_image = "0082.jpg"
    
    # 检查图像是否存在
    if not os.path.exists(input_image):
        print(f"错误: 输入图像 {input_image} 不存在")
        print("请将词典页面保存为 dictionary_page.jpg 并放在当前目录")
        exit(1)
    
    # 用户选择测试模式
    print("请选择测试模式:")
    print("1. 完整测试 (生成所有参数组合的图像)")
    print("2. 快速测试 (生成推荐参数组合的图像)")
    choice = input("请输入选择 (1 或 2): ")
    
    if choice == "1":
        # 完整参数测试
        test_binarization(input_image)
    elif choice == "2":
        # 快速测试
        quick_test(input_image)
    else:
        print("无效选择，默认执行快速测试")
        quick_test(input_image)