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

基于Python/OpenCV自适应阈值的书籍形状检测问题

解决方法

针对你的需求,直接用自适应阈值不太适配当前场景——书籍与桌面的全局对比度足够,书名等细节反而会被当成噪声干扰。可以按以下步骤处理:

  • 预处理降噪
    先将图像转为灰度图,再用高斯模糊弱化书名、纹理等细节噪声,避免后续阈值处理时误识别:

    import cv2 as cv
    import numpy as np
    
    # 读取图像并转灰度
    img = cv.imread("book.jpg")
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    # 高斯模糊降噪
    blurred = cv.GaussianBlur(gray, (5, 5), 0)
    
  • 全局阈值二值化
    利用OTSU自动阈值法,基于全局对比度分割书籍与背景,得到初始黑白图:

    _, binary = cv.threshold(blurred, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)
    

    这里用THRESH_BINARY_INV是为了让书籍区域变成白色、背景黑色,方便后续处理。

  • 形态学操作消除噪声
    创建矩形结构元素,用闭运算填充书籍区域内的小孔洞,再用开运算去除背景的小噪声点:

    # 创建5x5的矩形结构元素
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
    # 先开运算去噪声,再闭运算填充孔洞
    processed = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel)
    processed = cv.morphologyEx(processed, cv.MORPH_OPEN, kernel)
    
  • 轮廓筛选与填充
    查找图像中的轮廓,筛选出面积最大的轮廓(即书籍的轮廓),然后在空白白底画布上填充该轮廓,得到目标效果:

    # 查找轮廓
    contours, _ = cv.findContours(processed, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    # 筛选面积最大的轮廓
    max_contour = max(contours, key=cv.contourArea)
    # 创建空白白底图像
    result = np.ones_like(img) * 255
    # 填充轮廓为黑色
    cv.drawContours(result, [max_contour], -1, (0, 0, 0), thickness=cv.FILLED)
    # 若需要单通道灰度图,可执行以下转换
    result_gray = cv.cvtColor(result, cv.COLOR_BGR2GRAY)
    

上述步骤能有效消除噪声,同时完整保留书籍的矩形形状,得到你需要的白底黑填充效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:22:12