惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
M
MIT News - Artificial intelligence
S
SegmentFault 最新的问题
博客园 - 叶小钗
量子位
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
V
Visual Studio Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - 【当耐特】
Google DeepMind News
Google DeepMind News
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
博客园_首页
U
Unit 42
月光博客
月光博客
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

博客园 - 彭成刚

localforage js数据存储 localStorage 替代,可大数据存储 indexdb数据库 文件系统有 happy-opfs "editor.cursorSurroundingLines": 3, 光标周围行数 设置光标在第几行的时候滚动页面滚动条 Prettier - Code formatter BUG 读不到 根目录的 .prettierrc.js prettier.configPath 格式化失效 vue2 mounted后面括号应该没有空格 _.flow 管道函数 lodash 同步函数列表很哇塞啊 _.flow(caozuo1, caozuo2, caozuo3)(my_data) vue2 iview 组件 ref 起名规则 应该用文件名 <shouye_book_left ref="shouye_book_left" /> iview 日期组件 BUG 赋值变量选年度 然后当前年会有个蓝色底, 解决方案 :key="ccValue" ⭐️⭐️⭐️ 自定义组件 表单验证 v-model 自动更新验证 trigger: 'change' 不触发,解决方案 加 <Input v-model="formData.abc" /> vue2 iview ComfyUiApi comfyui_xy 安装-使用 mergeLeft 左合并json函数 alt+k vscode 执行 ccdev - 在editor 和 terminal 之间切换 splitTwo 分割2个元素,主要分割文件名和id等 pi.dev 试试这个cli - deepseek-flash-v4 C盘清理空间软件 c盘没空间了 Wise Disk Cleaner kceve 鼠标2口控制器 kvm 鼠标同步器 穿屏幕 快捷键 是 s + * 操作列css每个按钮a后面加竖线.css operation_class .prettierrc.js 我发现 这个格式化的配置 默认就不建议放全局,都是跟项目走的 grid-gap 在 chrome58 支持,然后chrome58 不支持 gird的gap,不支持flex的gap iview table columns.js 表头 带* 带星 renderHeader alt+F9 设置 open in terminal 打开当前文件terminal vscode idea 都设置成这个快捷键 配合 ccdev使用 ccdev go开发 cli开发 读取本地模版复制到剪切板 where.exe node 查看命令位置 powershell 注意不是 where node (新建了一个ccwhere.bat) vue2 vModel 组件绑定数据写法 ccValue reloadenv 函数 `code $PROFILE` vscode在不关闭下刷新环境变量 volta 安装记录 node多版本控制 && @native-sdk OmniVoice 记录 我觉得音色还原还不错 voiceclone-env 记录 vscode pwsh 全选快捷键 ctrl+a (powershell) ai专属使用 aitree 命令 ai配合重要命令 powershell vscode code $PROFILE 备份,配合conda使用vscode $setHideObjProp 设置js json对象属性 隐藏变量 不可枚举,post的时候不带这个变量
做了一个卷子去底的程序 python-clear-paper
彭成刚 · 2026-06-12 · via 博客园 - 彭成刚

需求

昨天孩子找我打印卷子,是别的同学拍的,直接打印 黑呼呼的。
ps调整,要点好几次,1张 2张还行,那也麻烦啊。
找了一个全能扫描王,新用户可以用图片去底的功能。
但是以后要钱了,就麻烦了。我就用这一个功能。
用ai写了一个代码,因为的第5版,所以是clear5,前4版效果都不好,打包用的pyinstaller
我打包是win64版本,因为我自己是win11 64位。

使用方法

将clear5.exe 和 照片放在一个目录,双击clear5.exe 会自动扫描当前目录图片,生成图片放在ok目录

下载地址

下载地址:https://gitee.com/pengchenggang/python-clear-paper/releases/tag/v1.0.1-clear5

程序大于100M,所以切割成了两个文件下载,一个opencv库就100M了

代码

import cv2
import numpy as np
import os
import glob

print("=========================================")
print("   试卷白底高清化工具 - 批量版 (离线)    ")
print("=========================================")

# 1. 自动在当前目录下创建名为 'ok' 的输出目录
output_dir = 'ok'
if not os.path.exists(output_dir):
    os.makedirs(output_dir)
    print(f"📁 已自动创建输出文件夹: {output_dir}")

# 2. 定义要扫描的文件类型
# image_extensions = ['*.jpg', '*.jpeg', '*.png', '*.JPG', '*.JPEG', '*.PNG']
found_files = []

# 2. 定义要扫描的文件类型(只需要写小写即可,后面会用 set 去重)
image_extensions = ['*.jpg', '*.jpeg', '*.png']
found_files_raw = []

# 3. 仅获取当前目录下的文件(不递归子目录)
for ext in image_extensions:
    found_files_raw.extend(glob.glob(ext))

# 【核心修复】使用 set() 去除由于大小写不区分导致的重复路径,再转回列表
found_files = list(set(found_files_raw))

if not found_files:
    print("\n❌ 错误:当前文件夹下没有找到任何 jpg 或 png 图片!")
    print("💡 使用方法:请把要处理的图片和本程序放在【同一个文件夹】里。")
    input("\n按回车键退出程序...")
    exit()

print(f"\n🚀 共发现 {len(found_files)} 张图片,开始批量处理...\n")

# 4. 循环处理每一张图片
success_count = 0
for file_path in found_files:
    # 获取纯文件名(例如 '01.jpg')
    base_name = os.path.basename(file_path)
    
    # 构造输出路径(例如 'ok/ok-01.jpg')
    # 保持原扩展名不变,方便查看
    output_path = os.path.join(output_dir, f"ok-{base_name}")
    
    print(f"⏳ 正在处理: {base_name} ...", end="", flush=True)
    
    # 读取图片(灰度模式)
    img = cv2.imread(file_path, cv2.IMREAD_GRAYSCALE)
    if img is None:
        print(" ❌ 读取失败,跳过。")
        continue

    # --- 核心图像算法(保持你优秀的去背透参数不变) ---
    bg = cv2.medianBlur(img, 31)
    img_float = img.astype(float)
    bg_float = bg.astype(float) + 1.0
    normalized = (img_float / bg_float * 255.0).clip(0, 255).astype(np.uint8)

    lut = np.arange(256, dtype=np.uint8)
    for i in range(256):
        if i > 225:
            lut[i] = 255  
        elif i < 100:
            lut[i] = int(pow(i / 100.0, 1.5) * 50)
        else:
            lut[i] = int(50 + (i - 100) * (255 - 50) / (225 - 100))

    result = cv2.LUT(normalized, lut)

    gaussian = cv2.GaussianBlur(result, (0, 0), 2)
    sharpened = cv2.addWeighted(result, 1.5, gaussian, -0.5, 0)

    # --- 保存输出到 ok 目录下 ---
    cv2.imwrite(output_path, sharpened)
    print("  ✅ 完成!")
    success_count += 1

print("\n=========================================")
print(f"🎉 批量任务结束!成功处理 {success_count}/{len(found_files)} 张图片。")
print(f"📂 所有导出的高清图片已存放在当前目录的 【{output_dir}】 文件夹中。")
print("=========================================")
input("\n按回车键退出...")