Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从图像中测量线段的长度(以像素为单位)_Python_Opencv_Image Processing_Object Detection - Fatal编程技术网

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

Python 从图像中测量线段的长度(以像素为单位),python,opencv,image-processing,object-detection,Python,Opencv,Image Processing,Object Detection,我有大量的图片,如下图所示。我正在尝试从透射电子显微镜图像中检测纳米颗粒,这是我使用OpenCV Python成功实现的。这张图像只是一张更大的透射电子显微镜图像左下角的一部分。我想提取“100 nm”下白色线段的长度。目前,我正在手动测量这条线的长度,我想将其自动化。我认为这可以用OpenCV Python通过轮廓来完成,但是我还有很多其他的特性,这些特性也在图像中轮廓化了。我是Python新手,我不太确定如何实现它,或者是否可以实现它。我对代码应该做什么的想法: 加载图像 找到白色的线段 返

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

  • 加载图像
  • 找到白色的线段
  • 返回它的长度(以像素为单位)
  • 如果它检测到行上方的数字并返回它,那也很好
  • 欢迎提出任何建议、指示或“从哪里开始”的意见,并表示感谢

    直线段在其特征上非常独特,每个图像中只有一条直线


    一种方法是使用概率Hough线方法检测线

    结果将是:

    现在问题是检测到多条线。我们知道他们的坐标。如果我们将它们全部打印出来:

    Pixel Length: 296
    Pixel Length: 197
    Pixel Length: 308
    Pixel Length: 175
    Pixel Length: 292
    Pixel Length: 229
    Pixel Length: 103
    Pixel Length: 109
    
    由于检测到的长度很多,可能找到其平均值是有意义的:

    Average Pixel Length: 109 pixel
    
    虽然我不知道如何将109像素转换为100nm

    import cv2
    import numpy as np
    
    img = cv2.imread("4HQtp.png")
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
    base = cv2.HoughLinesP(edges, 1, np.pi / 180, 80, minLineLength=1, maxLineGap=6)
    pixel_array = []
    pixel_length = 0
    if base is not None:
        for line in base:
            x1, y1, x2, y2 = line[0]
            cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
            pixel_length = np.abs(x2 - x1)
            pixel_array.append(pixel_length)
            print("Pixel Length: {}".format(pixel_length))
        cv2.imshow("img", img)
        cv2.imwrite("hough_img.png", img)
        cv2.waitKey(0)
    print("Average Pixel Length: {:.0f} pixel".format(np.average(pixel_array)))
    

    您可以对图像进行二值化以查找缩放段的轮廓:

    scale=cv2.imread('scalenanometer.png',cv2.imread\u COLOR)
    刻度\灰色=cv2.CVT颜色(刻度,cv2.COLOR \灰色)
    #调整下一行的第二个值以调整检测
    ret,thresh=cv2.阈值(灰度,210,255,cv2.thresh\u二进制)
    轮廓,层次=cv2.查找轮廓(阈值,cv2.RETR\u外部,cv2.链近似\u简单)
    #滤波器噪声检测
    等高线=[c表示等高线中的c,如果cv2.等高线面积(c)>100]
    #按(y,x)排序
    sort(key=lambda c:(cv2.boundingRect(c)[1],cv2.boundingRect(c)[0]))
    #关于该部分的工作
    cv2.矩形(比例,cv2.边界矩形(轮廓[-1]),(0255,0),2)
    x、 y,w,h=cv2.boundingRect(等高线[-1])
    印刷体(x,y,w,h)#x,y:(39152)w,h:[304 21]
    

    如果要检测该值,可以使用tesseract ocr。

    Hi,白线等于100 nm。我需要的只是像素大小,因为我需要使用这个比例来测量图像中的其他对象。我会尝试一下,然后再给你回复。这种方法不够有效,因为HoughLine检测到很多像
    [197175103]
    这样大小的“小”线,这显然是所需片段的一小部分。所以你的最终平均值是完全正确的wrong@Ahmet,您的平均值为213,并且段大小大于300。。。你怎么称呼它?在哪里<代码>平均像素长度:109像素第一:109是最差的,第二:你怎么能用你给出的值将109作为平均值?您的代码中有一个计算平均值的错误。。。你用1个值计算你的平均值,而不是一个值列表,所以你的平均值总是最后一个值…所以,我应该每次裁剪更大的图像,以避免其他轮廓。我将研究tesseract ocr。谢谢你。我将尝试此方法并进行更新。最好是裁剪以避免噪音/虚假检测,并且使用此方法,它不是基于平均值,因此您应该始终获得相同的结果,除非您更改阈值效果非常好,而且非常精确的宽度测量(与其他测量工具相比)非常感谢!只是想知道排序函数到底在做什么。我知道会有多个轮廓。因此,通过排序,您可以选择最大的矩形?@worriedWaiting,排序行将按
    (y,x)
    进行排序,因为
    findContours()。