You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:53:21