如何使用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
相关产品推荐
相关产品推荐

