基于OpenCV的伤口形状检测:当前误识别为圆形,是否改用轮廓检测?
改用轮廓检测是解决伤口区域识别的最优方案
是的,你绝对应该改用轮廓检测。你的当前方案依赖cv.HoughCircles,只能识别规则圆形,但从输入图片来看,伤口是不规则的类椭圆形/异形区域,Hough圆检测完全无法覆盖这种场景——这就是你当前输出不符合需求的核心原因。轮廓检测能精准捕捉任意形状的区域边界,完美适配伤口识别的需求。
替换方案:Python版轮廓检测实现
直接把你代码中的Hough圆检测部分替换为以下轮廓检测逻辑,适配你的FastAPI接口:
修改后的完整接口代码
@app.post("/api/detect-shapes") async def post_detect_shapes(image_file: UploadFile = File(...)): # 读取并解码图片 contents = await image_file.read() nparr = np.fromstring(contents, np.uint8) img = cv.imdecode(nparr, cv.IMREAD_COLOR) output = img.copy() detected_polygons = [] # 轮廓检测核心流程 gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 自动二值化分割伤口与背景 _, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU) # 形态学操作去除小噪点 kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5,5)) binary = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel, iterations=2) # 查找外部轮廓(只保留最外层区域,避免内部干扰) contours, _ = cv.findContours(binary.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # 过滤小轮廓并简化形状 min_area = 500 # 可根据伤口大小调整阈值 for cnt in contours: area = cv.contourArea(cnt) if area > min_area: # 轮廓近似,减少点数量同时保留形状特征 epsilon = 0.01 * cv.arcLength(cnt, True) approx = cv.approxPolyDP(cnt, epsilon, True) detected_polygons.append(approx.tolist()) # 在输出图上绘制轮廓 cv.drawContours(output, [approx], -1, (0,255,0), 2) # 保留原有的base64转换与返回逻辑 original_img_pil = Image.fromarray(cv.cvtColor(img, cv.COLOR_BGR2RGB)) original_img_base64 = image_to_base64(original_img_pil) output_img_pil = Image.fromarray(cv.cvtColor(output, cv.COLOR_BGR2RGB)) output_img_base64 = image_to_base64(output_img_pil) rn:int = random.randint(0, 100) return {'original_img_base64': original_img_base64, 'output_img_base64': output_img_base64, "detected_polygon": detected_polygons}
关键步骤说明
- 自动二值化:用OTSU算法自动计算阈值,快速区分伤口(深色)与皮肤(浅色)区域,适配不同光照条件的图片
- 形态学去噪:通过开运算去除图片中的微小噪点,避免误识别小区域
- 轮廓过滤:设置最小面积阈值,过滤掉灰尘、毛发等干扰轮廓
- 轮廓近似:简化轮廓点数量,减少返回的数据量,同时保持伤口的形状特征
优化建议
- 根据实际伤口的大小,调整
min_area参数 - 如果伤口与皮肤的颜色差异明显,可尝试先通过HSV颜色空间提取伤口区域,再做轮廓检测,精度会更高
- 可加入轮廓密实度(Solidity)判断,过滤掉空洞较多的干扰区域(伤口区域通常是密实的)
内容的提问来源于stack exchange,提问作者The Old County
相关产品推荐
相关产品推荐

