在图像中提取激光线(使用OpenCV)

Mir*_*nyy 6 c++ opencv image line detection

我有一张激光线的照片,我想从图像中提取出那条线.

在此输入图像描述

由于激光线是红色的,我采用图像的红色通道,然后在每一行中搜索最高强度:

在此输入图像描述

现在的问题是,还有一些点不属于激光线(如果你放大第二张图片,你可以看到这些点).

有没有人有下一步的想法(删除单点,也提取线)?

这是另一种检测线的方法:首先我用内核模糊了"黑白"线,然后我将线条模糊(细化)到细线,然后我应用OpenCV函数来检测线条.结果如下图所示:在此输入图像描述

新:

现在我有另一个更难的情况.我必须提取绿色激光.
这里的问题是激光线的颜色范围更宽并且变化.
在激光线的某些部分上,像素仅具有高绿色成分,而在其他部分上,像素也具有高蓝色成分. 在此输入图像描述

Gre*_*ard 2

对于没有任何代码的简短回答,我真的很抱歉,但我建议您绘制轮廓并处理它们。

我不知道你具体需要什么,所以这里有两种方法适合你:

  • 只需在单线上收集尽可能多的轮廓(使用中心并尝试找到具有最小均值的直线)

  • 作为第一种方法,但尝试试探性地组合分离的线......这要困难得多,但这可能会给你几乎完整的图像激光线。

--

你的图片的一些例子:

import cv2
import numpy as np
import math

img = cv2.imread('image.png')
hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
# filtering red area of hue
redHueArea = 15
redRange = ((hsv[:, :, 0] + 360 + redHueArea) % 360) 
hsv[np.where((2 * redHueArea) > redRange)] = [0, 0, 0] 
# filtering by saturation
hsv[np.where(hsv[:, :, 1] < 95)] = [0, 0, 0]
# convert to rgb
rgb = cv2.cvtColor(hsv, cv2.COLOR_HSV2RGB)
# select only red grayscaled channel with low threshold  
gray = cv2.cvtColor(rgb, cv2.COLOR_RGB2GRAY)
gray = cv2.threshold(gray, 15, 255, cv2.THRESH_BINARY)[1]
# contours processing
(_, contours, _) = cv2.findContours(gray.copy(), cv2.RETR_LIST, 1)
for c in contours:
    area = cv2.contourArea(c)
    if area < 8: continue
    epsilon = 0.1 * cv2.arcLength(c, True) # tricky smoothing to a single line
    approx = cv2.approxPolyDP(c, epsilon, True)
    cv2.drawContours(img, [approx], -1, [255, 255, 255], -1)

cv2.imshow('result', img)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)

在你的情况下,它工作得很好,但是,正如我已经说过的,你将需要对轮廓做更多的工作。

在此输入图像描述