python - 测量图像中线段的长度(以像素为单位)

标签 python opencv image-processing object-detection

我有大量的图像,如下所示。我正在尝试从透射电子显微镜图像中检测纳米颗粒,这是我使用OpenCV-Python成功实现的。该图像只是较大的透射电子显微镜图像的左下角的一部分。我想提取“100 nm”下白色线段的长度。目前,我正在手动测量这条线的长度,并且我想使它自动化。我认为可以使用OpenCV-Python通过轮廓绘制来完成此操作,但是我还有许多其他功能也在图像中绘制了轮廓。我是Python的新手,我不确定如何实现此功能,或者是否可以完全实现。我对代码应该做什么的想法:

  • 加载图片
  • 查找白线段
  • 返回其长度(以像素为单位)。
  • 如果它检测到行上方的数字并返回它,那也很好。

  • 任何建议,方向或“从哪里开始”评论都将受到欢迎和赞赏。
    该段线在功能上非常独特,每张图像中只有一条线。
    enter image description here

    最佳答案

    您可以将图像二值化以找到比例尺段的轮廓:
    processing

    scale = cv2.imread('scalenanometer.png', cv2.IMREAD_COLOR)
    scale_gray = cv2.cvtColor(scale, cv2.COLOR_BGR2GRAY)
    # adjust the second value of the next line to tune the detection
    ret, thresh = cv2.threshold(scale_gray, 210, 255, cv2.THRESH_BINARY)
    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    # filter noisy detection
    contours = [c for c in contours if cv2.contourArea(c) > 100]
    # sort from by (y, x)
    contours.sort(key=lambda c: (cv2.boundingRect(c)[1], cv2.boundingRect(c)[0]))
    # work on the segment
    cv2.rectangle(scale, cv2.boundingRect(contours[-1]), (0,255,0), 2)
    x,y,w,h = cv2.boundingRect(contours[-1])
    print(x,y,w,h) # x,y: (39 152) w,h: [304 21]
    
    如果要检测该值,可以使用tesseract ocr。

    关于python - 测量图像中线段的长度(以像素为单位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63690237/

    相关文章:

    c++ - 尝试在 OpenCv 中使用 sift 匹配两个图像,但匹配太多

    ios - 二值过滤的阈值

    python - 在对 child 调用 super 时理解什么是 self

    c++ - 了解 OpenCV fitEllipse 方法

    r - videoplayR 的 github_install 和 R CMD INSTALL 失败

    c++ - 堆已损坏 opencv

    image-processing - 手写英文字符数据集..在哪里获得(公开可用)

    python - pygame与子弹的碰撞找不到碰撞

    python - 如何访问keras中的类概率?

    python - 如何为 python http 连接指定经过身份验证的代理?