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
相关产品推荐
相关产品推荐

