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

OpenCV如何使用contours仅提取反色阈值图像中的深色黄色建筑物区域

问题原因

  • 阈值函数参数配置错误:cv.threshold第三个参数为阈值化后的最大值,你设置为6导致二值图像高低灰度差过小,无法正确区分目标和背景;同时固定阈值6没有过滤掉背景噪声。
  • 未对提取到的轮廓做面积过滤,大量小噪声点的轮廓也被绘制到结果图中。

修改后可运行代码

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

# 灰度转换、反色逻辑保持不变
img = cv.cvtColor(sample_img, cv.COLOR_BGR2GRAY)
imagem = cv.bitwise_not(img)

# 阈值参数修正:使用OTSU自动阈值适配图像亮度,最大值设为255保证二值区分度
ret, thresh = cv.threshold(imagem, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
# 自动阈值效果不符合预期时可替换为手动阈值,如:
# ret, thresh = cv.threshold(imagem, 20, 255, cv.THRESH_BINARY)

# 可选:添加形态学开运算去除小噪声,让目标区域更连贯
kernel = np.ones((3,3), np.uint8)
thresh = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel, iterations=1)

# 提取轮廓后添加面积过滤,剔除小噪声轮廓,面积阈值可根据实际图像效果调整
contours = cv.findContours(thresh, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)[-2]
valid_contours = [cnt for cnt in contours if cv.contourArea(cnt) > 100]

# 绘制有效轮廓
blank = np.zeros((500,640,3), dtype = np.uint8)
contour_img = cv.drawContours(blank, valid_contours, -1, (255,255,255), 3)
plt.imshow(contour_img)
plt.show()

优化建议

如果黄色建筑的颜色特征稳定,可直接在HSV颜色空间做颜色分割,相比灰度阈值准确率更高,不会误判灰度接近的非目标区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 02:24:02