首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从图像中测量以像素为单位的线段长度

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

Stack Overflow用户
提问于 2020-09-01 14:57:44
回答 2查看 3.8K关注 0票数 1

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

  1. 加载图像
  2. 找到白线段
  3. 返回它的长度(以像素为单位)。
  4. 也很好,如果它检测到该行上方的数字并返回它。

任何建议,指导或‘从哪里开始’的意见将受到极大的欢迎和赞赏。

线段在其特征上是非常独特的,每幅图像中只有一条线。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-01 15:46:13

您可以对图像进行二值化,以找到比例段的轮廓:

代码语言:javascript
复制
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。

票数 3
EN

Stack Overflow用户

发布于 2020-09-01 15:24:55

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

其结果将是:

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

代码语言:javascript
复制
Pixel Length: 296
Pixel Length: 197
Pixel Length: 308
Pixel Length: 175
Pixel Length: 292
Pixel Length: 229
Pixel Length: 103
Pixel Length: 109

由于检测到了大量的长度,也许找到它的平均值是有意义的:

代码语言:javascript
复制
Average Pixel Length: 109 pixel

虽然我不知道如何将109像素转换为100‘m。

代码语言:javascript
复制
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)))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63690237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档