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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:06:03