基于OpenCV的TLC斑点检测:形状检测优化技术求助
TLC斑点检测问题求助
我在工作中用TLC得到了带斑点的试纸,需要先检测TLC板尺寸、完成图像变换(这部分已经实现),但斑点检测环节一直卡壳。我调试了大量参数,用下面的代码还是检测不到斑点,求解决方案:
import numpy import cv2 image_path="C:/Users/jules/Downloads/Start.jpg" image = cv2.imread(image_path) img = cv2.resize(img, (950, 1480)) output = image.copy() gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) hist = cv2.equalizeHist(gray) blur = cv2.GaussianBlur(hist, (31,31), cv2.BORDER_DEFAULT) _, thresh_image = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY) height, width = thresh_image.shape[:2] minR = round(width/65) maxR = round(width/11) minDis = round(width/7) circles = cv2.HoughCircles(thresh_image, cv2.HOUGH_GRADIENT, 1, minDis, param1=14, param2=25, minRadius=minR, maxRadius=maxR) if circles is not None: circles = numpy.round(circles[0, :]).astype("int") for (x, y, r) in circles: cv2.circle(output, (x, y), r, (0, 255, 0), 2) cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1) cv2.imshow("result", numpy.hstack([image, output]))
问题分析与解决方案
1. 原代码核心问题
- 预处理做了直方图均衡和高斯模糊,但阈值处理用的是原始灰度图
gray,等于浪费了前两步的效果; cv2.HoughCircles仅对标准圆形斑点敏感,TLC斑点常为不规则形状,适配性差;- 固定阈值
120鲁棒性低,不同光照下的试纸容易出现过曝或欠曝,导致斑点丢失。
2. 修正后的代码与思路
调整逻辑:
- 用预处理后的图像做阈值分割;
- 改用大津法(Otsu)自动计算阈值,适配不同光照;
- 用轮廓检测替代霍夫圆,支持不规则斑点检测。
修正代码:
import numpy as np import cv2 image_path = "C:/Users/jules/Downloads/Start.jpg" image = cv2.imread(image_path) # 修复原代码中resize未定义变量的bug image_resized = cv2.resize(image, (950, 1480)) output = image_resized.copy() # 预处理流程 gray = cv2.cvtColor(image_resized, cv2.COLOR_BGR2GRAY) # 直方图均衡增强斑点与背景的对比度 eq_gray = cv2.equalizeHist(gray) # 高斯模糊降噪,核大小根据斑点清晰度调整 blur = cv2.GaussianBlur(eq_gray, (15, 15), 0) # 大津法自动计算阈值,适配明暗对比的斑点(INV适配深色斑点,若斑点偏亮则去掉INV) _, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 形态学开运算:先腐蚀再膨胀,去除小噪点 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)) thresh_clean = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1) # 轮廓检测,仅保留最外层轮廓 contours, _ = cv2.findContours(thresh_clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 过滤过小的轮廓,避免误检噪点 min_area = 100 for cnt in contours: area = cv2.contourArea(cnt) if area > min_area: # 用最小外接圆标记斑点 (x, y), r = cv2.minEnclosingCircle(cnt) center = (int(x), int(y)) r = int(r) cv2.circle(output, center, r, (0, 255, 0), 2) cv2.rectangle(output, (center[0]-5, center[1]-5), (center[0]+5, center[1]+5), (0,128,255), -1) cv2.imshow("Original vs Result", np.hstack([image_resized, output])) cv2.waitKey(0) cv2.destroyAllWindows()
3. 额外优化建议
- 若斑点比背景亮,把阈值模式改为
cv2.THRESH_BINARY; - 调整高斯模糊核大小(9x9到21x21之间),匹配实际斑点的清晰度;
- 根据斑点实际大小微调
min_area阈值,过滤无关噪点。
内容的提问来源于stack exchange,提问作者Juju
相关产品推荐
相关产品推荐

