基于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
相关产品推荐
相关产品推荐

