如何使用OpenCV提取图像中的不规则形状区域(以耐克标志提取为例)
提取Nike标志的OpenCV实现方案
你提供的示例图中耐克标志为深色,和白色鞋身、浅灰色背景的色差非常明显,用颜色阈值结合轮廓筛选的方案就能精准提取,具体步骤和代码如下:
- 预处理阶段:将原图从BGR格式转成HSV颜色空间,相比RGB更适合做颜色区间筛选,设置对应深色的HSV阈值,得到包含目标标志的初始二值蒙版。
- 蒙版降噪:对初始蒙版做形态学开运算去除细碎噪点,再做闭运算补全标志内部可能存在的小缺口。
- 轮廓筛选:在处理完成的蒙版上提取所有外轮廓,按面积从大到小排序,最大的轮廓即为你需要的耐克标志区域。
- 结果提取:用筛选后的轮廓生成最终蒙版,和原图做按位与操作,即可得到单独的耐克标志提取结果。
示例代码
import cv2 import numpy as np # 读取本地图片 img = cv2.imread("shoe_sample.png") # 转换为HSV颜色空间 hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 黑色标志的HSV阈值区间,*可根据实际图片效果微调* lower_dark = np.array([0, 0, 0]) upper_dark = np.array([180, 255, 80]) # 生成初始二值蒙版 init_mask = cv2.inRange(hsv_img, lower_dark, upper_dark) # 形态学操作降噪补洞 kernel = np.ones((5, 5), np.uint8) init_mask = cv2.morphologyEx(init_mask, cv2.MORPH_OPEN, kernel) init_mask = cv2.morphologyEx(init_mask, cv2.MORPH_CLOSE, kernel) # 提取所有外轮廓 contours, _ = cv2.findContours(init_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 按轮廓面积降序排序,取最大的轮廓为目标 contours_sorted = sorted(contours, key=cv2.contourArea, reverse=True) target_contour = contours_sorted[0] # 生成最终精准蒙版 final_mask = np.zeros_like(init_mask) cv2.drawContours(final_mask, [target_contour], -1, 255, -1) # 提取目标区域 extract_result = cv2.bitwise_and(img, img, mask=final_mask) # 保存结果 cv2.imwrite("extracted_nike_logo.png", extract_result)
如果后续需要处理标志和背景对比度较低的场景,可以替换阈值步骤,改用grabCut算法结合少量人工标注实现更高精度的提取。
内容的提问来源于stack exchange,提问作者ailsin
相关产品推荐
相关产品推荐

