首页 > 编程问答 >用于 TLC 斑点检测的 CV2 形状检测的改进

用于 TLC 斑点检测的 CV2 形状检测的改进

时间:2024-07-23 05:54:57浏览次数:12  
标签:python opencv geometry shapes detection

在我的工作中,我使用 TLC,它给了我像这张照片上的物体。它是一张纸,上面有精确高度的斑点。

TLC picture

我需要检测板本身并进行测量。 然后我需要将其转换为这张图片:

enter image description here

我想我可以生成第二张图片,但我在斑点检测方面遇到了麻烦。我使用下面的代码和许多不同的参数,但我无法检测到它们。您有什么想法吗?

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]))

预先感谢您的帮助!


我理解你想使用 OpenCV (cv2) 在 TLC 图像中检测斑点并测量它们。你当前的代码似乎是在寻找圆形斑点,而 TLC 斑点通常形状不规则。这就是你的 Hough 圆变换方法难以检测到它们的原因。

让我们试试一种不同的方法来检测不同形状的 TLC 斑点:

1. 图像预处理:

  • 转换到灰度: 你的代码已经这样做了 ( gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) )。
  • 阈值化: 你需要尝试不同的阈值方法和值,以获得最佳结果。你目前使用的是二值阈值化,这可能太苛刻,并且可能会丢失信息。考虑使用自适应阈值化 ( cv2.adaptiveThreshold ),该方法可以根据图像区域更好地处理光照变化:
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
  • 形态学操作: 你可以使用形态学操作(如腐蚀和膨胀)来减少噪声并改善斑点的形状。例如,要使用腐蚀去除小噪声,你可以使用:
kernel = numpy.ones((3,3), numpy.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations = 2)

2. 斑点检测:

  • 轮廓检测: Zamiast HoughCircles ,使用 cv2.findContours 检测斑点的轮廓。这将更适合不同形状的斑点。
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1] 
  • 过滤轮廓: 你可能想根据大小或纵横比等条件过滤检测到的轮廓,以去除不想要的噪声或伪影。
for c in cnts:
    area = cv2.contourArea(c)
    if area > 100: # 忽略太小的区域(调整此值)
        cv2.drawContours(image, [c], -1, (0,255,0), 2) 

3. 测量和可视化:

  • 边界框: 你可以使用 cv2.boundingRect(c) 获取每个轮廓的边界框,并使用它来测量斑点高度和位置。

  • 绘制: 使用 cv2.rectangle cv2.putText 将检测到的斑点、它们的边界框和测量值绘制在图像上,如你的目标图像中所示。

代码示例:

import cv2
import numpy

image_path = "C:/Users/jules/Downloads/Start.jpg"
image = cv2.imread(image_path)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)

kernel = numpy.ones((3,3), numpy.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations = 2)

cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

for c in cnts:
    area = cv2.contourArea(c)
    if area > 100: 
        x,y,w,h = cv2.boundingRect(c)
        cv2.rectangle(image, (x,y), (x+w, y+h), (0,255,0), 2)
        cv2.putText(image, f"H: {h}", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 2)

cv2.imshow("result", image)
cv2.waitKey(0)

这只是一个起点,你可能需要根据你的特定图像和要求调整参数和步骤。例如,如果你的图像有很大的照明变化,你可能需要更先进的阈值化技术,或者如果你的斑点有非常不规则的形状,你可能需要使用不同的特征进行检测。

标签:python,opencv,geometry,shapes,detection
From: 78780860

相关文章

  • 如何构建一维数组的二维数组的特定 Python 结构?
    如何构建一维数组(即行向量)的二维数组的特定结构以满足特定我正在维护的遗留程序的结构?我可以在此结构中生成正确的内容all_measurements[:12]array([[0.,0.,0.,2.],[0.02,0.334,0.04,2.24],[0.04,0.668,0.08,2.48],...........
  • 如何使用 Python Flask 将新的咖啡馆(元素)添加到数据库(SQLite)?
    这是我的代码:@app.route("/add",methods=["POST"])defpost_new_cafe():new_cafe=Cafe(name=request.form.get("name"),map_url=request.form.get("map_url"),img_url=request.form.get("img......
  • 使用 tkinter 为 python 创建 GUI 时如何解决语法错误?
    我是一名Python初学者,决定使用tkinter制作一个小型GUI,该GUI接受用户(潜在餐馆)的3个输入,然后单击按钮后随机输出其中一家餐馆。我不断收到语法错误,并认为它与我的buttonfunc或调用它的命令有关。此代码尚未包含在GUI上输出餐厅的任何位置。任何帮助将不胜感激#Pyth......
  • 在 python 中打开 gnome 终端立即显示为僵尸
    作为背景,我正在编写一个脚本来训练多个pytorch模型。我有一个训练脚本,我希望能够在gnome终端中作为子进程运行。这样做的主要原因是我可以随时关注训练进度。如果我可能有多个GPU,我想在单独的窗口中多次运行我的训练脚本。为了实现这一点,我一直在使用popen。以下代码用于打......
  • python threading.Condition 的意外行为
    我正在尝试同步多个线程。我期望使用threading.Condition和threading.Barrier时的脚本输出大致相同,但事实并非如此。请解释一下为什么会发生这种情况。一般来说,我需要线程在一个无限循环中执行工作(一些IO操作),但是每个循环都是以主线程的权限开始的,而权限是仅在......
  • Python - 逆透视数据框
    我有一个按日期时间索引的表,每个日期时间都有多个层(中心和交货间隔):日期时间中心交货间隔结算点价格2024-01-0101:00:00休斯顿中心1......
  • 试图理解这个错误:致命的Python错误:PyEval_RestoreThread:该函数必须在持有GIL的情况下
    我有一个小型tkinter应用程序,我一直在其中实现最小的“拖放”,主要作为学习实验。我真正关心的是删除文件的文件路径。一切实际上都工作正常,直到我尝试在拖放后打包标签小部件。下面的最小工作示例。有问题的行会用注释指出。我通常不会在调试方面遇到太多麻烦,但我只是不知......
  • 如何使代码格式再次适用于 Python(Mac 上的 Visual Studio Code)?
    在Mac上,Option+Shift+F现在会显示“没有安装用于‘python’文件的格式化程序”。消息框:我尝试安装这个插件,但没有看到这种情况的变化:我已经为Python安装了这两个插件:但是正如@starball提到的,它可能已经减少了支持现在。......
  • 无法在 python 中安装 pip install expliot - bluepy 的 Building Wheel (pyproject.t
    在此处输入图像描述当我尝试在Windows计算机中通过cmd安装pipinstallexpliot包时,我收到2个错误名称×Buildingwheelforbluepy(pyproject.toml)didnotrunsuccessfully.│exitcode:1**AND**opt=self.warn_dash_deprecation......
  • python 用单斜杠-反斜杠替换url字符串中的双斜杠
    我的URL包含错误的双斜杠(“//”),我需要将其转换为单斜杠。不用说,我想保持“https:”后面的双斜杠不变。可以在字符串中进行此更改的最短Python代码是什么?我一直在尝试使用re.sub,带有冒号否定的正则表达式(即,[^:](//)),但它想要替换整个匹配项(包括前面......