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

书籍轮廓提取遇阻,寻求通用OpenCV解决方案

书籍轮廓提取优化方案

针对你遇到的问题,这里提供一套更鲁棒的处理流程,不受背景颜色和顶部蓝色区域的影响:

核心处理步骤

  1. 转换到HSV颜色空间:保留颜色特征,避免灰度化丢失关键区分信息
  2. 多范围颜色掩码:同时匹配书籍主体棕色与顶部蓝色区域,生成完整的书籍区域掩码
  3. 形态学闭操作:消除边缘小噪点(如"M"字符),填充掩码内部空隙
  4. 轮廓筛选与近似:提取面积最大的轮廓并近似为矩形,精准获取书籍外框

完整代码实现

import cv2
import numpy as np

# 读取目标图片
image = cv2.imread("book_image.jpg")
# 转换到HSV颜色空间,便于颜色筛选
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 定义书籍的颜色范围(可根据实际图片微调)
# 主体棕色的HSV范围
lower_brown = np.array([10, 50, 50])
upper_brown = np.array([30, 255, 255])
# 顶部蓝色的HSV范围
lower_blue = np.array([90, 50, 50])
upper_blue = np.array([130, 255, 255])

# 生成对应颜色的掩码并合并
mask_brown = cv2.inRange(hsv, lower_brown, upper_brown)
mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)
full_mask = cv2.bitwise_or(mask_brown, mask_blue)

# 形态学闭操作:先膨胀再腐蚀,去除小噪点并填充内部空隙
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
processed_mask = cv2.morphologyEx(full_mask, cv2.MORPH_CLOSE, kernel)

# 查找轮廓,仅保留最外层轮廓
contours, _ = cv2.findContours(processed_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 筛选出面积最大的轮廓(即书籍外框)
max_contour = max(contours, key=cv2.contourArea)

# 轮廓近似,将不规则轮廓转换为矩形
epsilon = 0.02 * cv2.arcLength(max_contour, True)
book_contour = cv2.approxPolyDP(max_contour, epsilon, True)

# 在原图上绘制轮廓
result_img = image.copy()
cv2.drawContours(result_img, [book_contour], 0, (0, 255, 0), 3)

# 查看处理效果
cv2.imshow("Processed Mask", processed_mask)
cv2.imshow("Book Contour", result_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键优化说明

  • 颜色掩码替代灰度处理:直接通过颜色区分书籍与背景,不受背景颜色变化影响,比灰度阈值法鲁棒性更强
  • 形态学操作:闭操作可以有效过滤边缘的小字符干扰,同时填充书籍内部文字造成的掩码空隙
  • 轮廓筛选逻辑:仅保留面积最大的轮廓,避免误识别其他小区域;轮廓近似则让最终结果更贴合书籍的矩形外形

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:30:57