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