岩石检测技术求助:无法识别全部岩石,黑色岩石检测失败
岩石检测问题解决方案
我来帮你解决这个岩石检测的问题~你现在遇到的核心问题是当前的HSV颜色阈值完全没覆盖黑色岩石的特征,咱们一步步来调整:
为什么黑色岩石检测不到?
你当前设置的HSV阈值里,V_Min=139——而黑色岩石的明度(V通道)值非常低,通常在0-50左右,直接被这个高阈值过滤掉了,自然检测不到。同时你的H、S范围也只针对某一类颜色的岩石,所以只能识别部分岩石。
具体修改方案
1. 补充黑色岩石的HSV阈值范围
黑色的HSV特征是:色相(H)任意,饱和度(S)可高可低(纯黑S接近0,带杂色的黑S可能偏高),明度(V)极低。我们可以新增一个针对黑色的mask,然后和原有的岩石mask合并。
2. 优化代码,加入滑动条方便调试
你代码里已经有nothing(x)函数,刚好可以用来创建HSV滑动条,实时调整参数找到最适合的阈值,不用每次改代码重新运行。
修改后的完整代码如下:
import numpy as np import cv2 def nothing(x): pass # 创建窗口和滑动条,方便实时调整HSV参数 cv2.namedWindow("HSV Adjustments") cv2.createTrackbar("H_Min", "HSV Adjustments", 147, 179, nothing) cv2.createTrackbar("H_Max", "HSV Adjustments", 169, 179, nothing) cv2.createTrackbar("S_Min", "HSV Adjustments", 19, 255, nothing) cv2.createTrackbar("S_Max", "HSV Adjustments", 103, 255, nothing) cv2.createTrackbar("V_Min", "HSV Adjustments", 139, 255, nothing) cv2.createTrackbar("V_Max", "HSV Adjustments", 199, 255, nothing) # 新增黑色岩石的V阈值滑动条 cv2.createTrackbar("Black_V_Max", "HSV Adjustments", 50, 255, nothing) while True: name_pic='153.jpg' img = cv2.imread(name_pic) frame = cv2.imread(name_pic) if img is None: print("无法读取图片,请检查路径是否正确") break img = cv2.resize(img, (1500, 1000)) frame = cv2.resize(frame, (1500, 1000)) blurred = cv2.GaussianBlur(frame, (5, 5), 0) hsv = cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV) # 获取滑动条当前值 H_Min = cv2.getTrackbarPos("H_Min", "HSV Adjustments") H_Max = cv2.getTrackbarPos("H_Max", "HSV Adjustments") S_Min = cv2.getTrackbarPos("S_Min", "HSV Adjustments") S_Max = cv2.getTrackbarPos("S_Max", "HSV Adjustments") V_Min = cv2.getTrackbarPos("V_Min", "HSV Adjustments") V_Max = cv2.getTrackbarPos("V_Max", "HSV Adjustments") Black_V_Max = cv2.getTrackbarPos("Black_V_Max", "HSV Adjustments") # 原岩石的mask mask_rock = cv2.inRange(hsv, (H_Min, S_Min, V_Min), (H_Max, S_Max, V_Max)) # 黑色岩石的mask:H任意,S任意,V从0到设置的最大值 mask_black = cv2.inRange(hsv, (0, 0, 0), (179, 255, Black_V_Max)) # 合并两个mask,得到完整的岩石检测结果 mask_total = cv2.bitwise_or(mask_rock, mask_black) # 对mask做一些形态学操作,去除噪点 kernel = np.ones((5,5),np.uint8) mask_total = cv2.morphologyEx(mask_total, cv2.MORPH_OPEN, kernel) mask_total = cv2.morphologyEx(mask_total, cv2.MORPH_CLOSE, kernel) # 将mask应用到原图,显示检测结果 result = cv2.bitwise_and(img, img, mask=mask_total) cv2.imshow("Original", img) cv2.imshow("Detection Result", result) cv2.imshow("Mask", mask_total) # 按ESC退出循环 if cv2.waitKey(1) & 0xFF == 27: break cv2.destroyAllWindows()
使用说明
- 运行代码后,会弹出
HSV Adjustments滑动条窗口,你可以拖动各个滑块:- 调整原岩石的H/S/V阈值,确保原来能检测的岩石依然被识别
- 拖动
Black_V_Max滑块,找到能刚好覆盖所有黑色岩石的最大值(一般50左右就够,根据你的图片调整)
- 形态学操作(开运算+闭运算)可以帮你去除检测结果里的小噪点,让岩石轮廓更清晰
- 如果你的岩石还有其他颜色,也可以用同样的方法新增对应的mask,然后合并
内容的提问来源于stack exchange,提问作者Chinnawat Chinnapun
相关产品推荐
相关产品推荐

