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

如何使用OpenCV将主叶片以外的区域全部遮罩为黑色?

使用OpenCV结合Canny边缘检测实现叶片区域提取(背景置黑)

实现思路

由于图片背景差异大,颜色遮罩方案不适用,我们通过Canny边缘检测定位叶片轮廓,再用形态学操作优化轮廓完整性,最后通过掩码提取目标区域,将叶片以外的区域置黑。

具体代码实现

import cv2
import numpy as np

# 1. 读取图片并转为灰度图
img = cv2.imread('7nCj2.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 2. Canny边缘检测(可根据图片调整阈值)
edges = cv2.Canny(gray, threshold1=50, threshold2=150)

# 3. 形态学膨胀操作,填补边缘缝隙
kernel = np.ones((5, 5), np.uint8)
dilated_edges = cv2.dilate(edges, kernel, iterations=2)

# 4. 寻找最外层轮廓并筛选面积最大的(对应中间叶片)
contours, _ = cv2.findContours(dilated_edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
max_contour = max(contours, key=cv2.contourArea)

# 5. 创建全黑掩码并填充叶片轮廓为白色
mask = np.zeros_like(img)
cv2.drawContours(mask, [max_contour], -1, (255, 255, 255), thickness=cv2.FILLED)

# 6. 掩码与原图结合,保留叶片区域,其余置黑
result = cv2.bitwise_and(img, mask)

# 保存或显示结果
cv2.imwrite('leaf_black_bg.jpg', result)
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

参数调整说明

  • Canny阈值:若边缘检测不完整,可降低threshold1或提高threshold2;若背景噪声过多,可提高threshold1。
  • 形态学操作:若轮廓存在较多缝隙,可增大核尺寸(如(7,7))或增加迭代次数;若膨胀过度包含背景,可减小核尺寸或减少迭代次数。
  • 轮廓筛选:若存在同尺寸干扰物,可额外添加轮廓长宽比、形状近似度等筛选条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:12:39