低分辨率去模糊内核图像矩形宽度估计及OpenCV轮廓检测问题排查
问题原因
- 缺少二值化预处理:
cv2.findContours仅支持输入二值图像(像素值只有0和255),直接传入普通灰度/彩色图像会导致轮廓识别完全失准 - 前后景匹配错误:OpenCV默认识别白色前景、黑色背景的轮廓,你的内核图像里内核是深色、背景是浅色,直接查找的话会把整张图像的外框当成唯一的白色前景轮廓
- 轮廓筛选逻辑有问题:当前代码没有过滤无效噪声轮廓,当轮廓列表只有整图一个元素时,
np.argmin自然会返回整图的轮廓
修正后可运行代码
import cv2 import numpy as np # 读入图像并预处理 img = cv2.imread('替换为你的内核图像本地路径') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化+反色,让内核变成白色前景,若亮度不合适可调整阈值127,或使用下方OTSU自适应阈值 # _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV) # 查找最外层轮廓 contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) # 筛选面积接近5*5=25的有效轮廓,可根据实际情况调整面积阈值范围 valid_cnt = None for c in contours: area = cv2.contourArea(c) if 20 < area < 30: valid_cnt = c break if valid_cnt is not None: x,y,w,h = cv2.boundingRect(valid_cnt) print(f"内核边界框参数:宽{w},高{h},左上角坐标({x}, {y})") # 绘制边界框并展示 cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) cv2.imshow('识别结果',img) cv2.waitKey(0) cv2.destroyAllWindows() else: print("未识别到符合尺寸的内核区域,请调整二值化阈值或面积筛选范围")
内容的提问来源于stack exchange,提问作者Minnie
相关产品推荐
相关产品推荐

