You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenCV优化扫描书籍页面边缘伪影清理效果的技术咨询

扫描书籍图像边缘伪影清理优化思路

问题现状

  • 已完成OpenCV阈值处理与初步清理,但边缘伪影仍残留
  • 尝试添加黑边框+漫水填充后仍存在以下问题:
    • 图像1:左上角、右侧有斑点伪影
    • 图像2:左侧存在环形伪影
    • 图像3:左侧有伪影
    • 图像4:右上角“N”和左下角乐谱被误删

当前实现代码

import os
import cv2
import numpy as np

current_directory = os.path.abspath(os.path.dirname(__file__))
filenames = ['1.webp', '2.webp', '3.webp', '4.webp']

for filename in filenames:
  input_path = os.path.join(current_directory, filename)
  output_path = os.path.join(current_directory, filename + '-clean.webp')
  
  img = cv2.imread(input_path, cv2.IMREAD_GRAYSCALE)
  
  # Add a black border
  img = cv2.copyMakeBorder(img, 50, 50, 50, 50, cv2.BORDER_CONSTANT)
  
  # Flood fill with white, from the top left pixel
  cv2.floodFill(img, None, (0, 0), 255)
  
  # Trim the image by removing white pixels on all sides
  y_nonzero, x_nonzero = np.nonzero(img == 0)
  img = img[np.min(y_nonzero):np.max(y_nonzero), np.min(x_nonzero):np.max(x_nonzero)]
  
  cv2.imwrite(output_path, img)

优化方案

1. 漫水填充参数优化,避免误删有效内容

当前漫水填充仅从左上角单点出发,且未设置颜色容差,导致与边框灰度接近的有效内容被误填为白色。优化方向:

  • 添加颜色容差:通过cv2.floodFill的loDiff和upDiff参数,限定仅填充接近黑色的伪影区域,避免误改有效内容
  • 多种子点覆盖:同时从图像四个角落启动漫水填充,确保边缘伪影被全面处理

示例修改:

# 创建掩码避免修改原图像结构
mask = np.zeros((img.shape[0]+2, img.shape[1]+2), np.uint8)
# 设置容差,仅填充灰度值与黑色接近的区域
fill_params = dict(mask=mask, newVal=255, loDiff=(15,15,15), upDiff=(15,15,15))
cv2.floodFill(img, **fill_params, seedPoint=(0, 0))
cv2.floodFill(img, **fill_params, seedPoint=(img.shape[1]-1, 0))
cv2.floodFill(img, **fill_params, seedPoint=(0, img.shape[0]-1))
cv2.floodFill(img, **fill_params, seedPoint=(img.shape[1]-1, img.shape[0]-1))

2. 预处理增强伪影与有效内容的区分

针对残留的斑点、环形伪影,在漫水填充前添加形态学操作与自适应阈值:

  • 自适应阈值:替换固定阈值为cv2.adaptiveThreshold,让局部区域阈值更贴合内容,减少伪影生成
  • 开运算:先腐蚀再膨胀,精准去除小尺寸伪影斑点,同时保留有效内容的完整性

示例添加预处理步骤:

# 自适应阈值增强文本与背景对比度
img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
img = cv2.bitwise_not(img)  # 转回白底黑字格式

# 开运算去除小斑点伪影
kernel = np.ones((3,3), np.uint8)
img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, iterations=1)

3. 裁剪逻辑优化,基于轮廓而非像素坐标

当前依赖黑色像素坐标裁剪,易受未清理伪影或误填内容干扰。改为基于文档轮廓裁剪:

  • 用cv2.Canny边缘检测+轮廓提取,定位文档主体的最大轮廓
  • 过滤小轮廓,仅保留文档区域的边界,避免伪影影响裁剪范围

示例裁剪逻辑修改:

# 边缘检测提取文档轮廓
edges = cv2.Canny(img, 50, 150)
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 筛选最大轮廓(文档主体)
max_contour = max(contours, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(max_contour)
# 裁剪文档区域
img = img[y:y+h, x:x+w]

4. 个性化参数适配不同图像

针对四张图像的伪影差异,可添加个性化处理逻辑:

  • 读取图像后分析灰度分布,自动调整阈值、容差等参数
  • 对图像4这类边缘存在有效内容的情况,缩小边框宽度或跳过对应区域的漫水填充

内容的提问来源于stack exchange,提问作者Samuel Bradshaw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:05:58