Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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 3.x 计算特定暗区的平均宽度_Python 3.x_Opencv_Image Processing - Fatal编程技术网

Python 3.x 计算特定暗区的平均宽度

Python 3.x 计算特定暗区的平均宽度,python-3.x,opencv,image-processing,Python 3.x,Opencv,Image Processing,我正在处理与下面一幅相似的大部分图像。我希望能够计算黑线的平均宽度(大致为图像中的黄线),但不确定如何最好地在python中实现这一点。图像上没有黄线,只有黑带 原始图像: 第一种方法是使用测线仪 找到图像的边缘 img=cv2.imread('calculate_width.png')) 灰色\u img=cv2.CVT颜色(img,cv2.COLOR\u bgr2灰色) canny_img=cv2.canny(灰色_img,阈值1=150,阈值2=200) 探测线路

我正在处理与下面一幅相似的大部分图像。我希望能够计算黑线的平均宽度(大致为图像中的黄线),但不确定如何最好地在python中实现这一点。图像上没有黄线,只有黑带

原始图像:


第一种方法是使用
测线仪


  • 找到图像的边缘

    • img=cv2.imread('calculate_width.png'))
      灰色\u img=cv2.CVT颜色(img,cv2.COLOR\u bgr2灰色)
      canny_img=cv2.canny(灰色_img,阈值1=150,阈值2=200)
      
  • 探测线路

    • lines=createFastLineDetector(\u length\u threshold=20)。检测(canny\u img)
      
  • 计算距离

    • 对于cur in行:
      (x1,y1,x2,y2)=cur[0]
      dist=数学sqrt((x2-x1)**2)+(y2-y1)**2))
      打印({.2f},{.2f})-({.2f},{.2f})之间的距离={.2f}
      .格式(x1、y1、x2、y2、dist))
      cv2.线(img,pt1=(x1,y1),pt2=(x2,y2),颜色=(0,255,0),
      厚度=2)
      cv2.imshow(“检测到”,img)
      cv2.等待键(0)
      
  • 结果

    • (46.98884.00)-(50.37905.10)=21.37像素之间的距离
更新


如果我们将
图像分割
应用于以下区域:

  • 我们想用公式求出红线的长度和红线之间的距离
上层:

之间的距离(118.06868.42)-(96.92871.40)
(95.94872.67)-(75.85876.11)之间的距离
(74.88877.33)-(24.85886.16)之间的距离
(23.96887.62)-(0.01890.06)之间的距离
下表:

之间的距离(79.07894.60)-(99.02892.15)
(104.01886.54)-(125.99887.20)之间的距离
(40.93901.45)-(66.05898.40)之间的距离
(0.00906.02)-(33.99905.52)之间的距离
如果随机选择两个点:
(66.05898.40)
(24.85-886.16)
,则距离为:
41.23

这个解决方案并不完美,但它可能会给出一个更好的想法的直觉。因此,我将此作为答案发布

代码:

导入cv2
输入数学
将numpy作为np导入
从cv2.ximgproc导入createFastLineDetector
img=cv2.imread('calculate_width.png')
灰色\u img=cv2.CVT颜色(img,cv2.COLOR\u bgr2灰色)
ret,thresh=cv2.阈值(灰度,150255,
cv2.THRESH_二进制_INV+cv2.THRESH_OTSU)
内核=np.one((5,5),np.uint8)
opening=cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel)
sure\u bg=cv2.deplate(打开,内核)
距离变换=cv2.距离变换(打开,cv2.距离变换L2,5)
_,sure_fg=cv2.threshold(dist_transform,0.3*dist_transform.max(),
255, 0)
sure\u fg=np.uint8(sure\u fg)
未知=cv2.相减(确定为bg,确定为fg)
lines=createFastLineDetector(_length_threshold=20)。detect(未知)
对于cur in行:
(x1,y1,x2,y2)=cur[0]
dist=数学sqrt((x2-x1)**2)+(y2-y1)**2))
打印({.2f},{.2f})-({.2f},{.2f})之间的距离
.格式(x1、y1、x2、y2))
cv2.线(img,pt1=(x1,y1),pt2=(x2,y2),颜色=(0,255,0),
厚度=2)
cv2.imshow(“检测到”,img)
cv2.等待键(0)

谢谢您的回答@Ahx。OP中的黄线只是用来标记我试图计算平均距离的黑线,在我正在处理的实际图像中并不存在。根据您的回答,似乎需要出现黄线,因为计算?我会更新OP,让它更清晰。我想黄线是可用的。你有模板图像吗?刚刚添加到OP@Ahx。抱歉搞混了!不,没问题。为迟来的跟进道歉。经过一些轻微的修改,这适用于我的用例,谢谢!暗带是如何定义的?它似乎不是图像中最黑暗的部分。它总是在正确的波段上方吗?它总是一个特定宽度范围的暗带吗?检测波段是99%的问题,一旦检测到,很容易得到宽度。因此,我们需要知道用于识别带的逻辑。暗带本身就是钻头上的“磨损带”。因此,带宽是相当动态的,取决于钻头的使用水平。暗带总是在白带之上。你是对的,它通常不是图像中最暗的部分。