【发布时间】:2015-11-27 23:29:31
【问题描述】:
我正在用 Python 编写一个程序来遍历从视频帧中提取的图像并检测其中的线条。图像质量相当差,内容差异很大。这里有两个例子: Sample Image 1 | Sample Image 2
我正在尝试检测每张图像中的激光并查看它们的角度。最终我想看看这些角度的分布并输出其中三个的样本。
为了检测图像中的线条,我查看了以下各种组合:
- 霍夫线
- Canny 边缘检测
- 双边/高斯滤波
- 去噪
- 直方图均衡化
- 形态变换
- 阈值
我尝试了很多不同方法的组合,但我似乎无法想出任何真正有效的方法。我一直在尝试的是这些方面:
import cv2
import numpy as np
img = cv2.imread('testimg.jpg')
grey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
equal = clahe.apply(grey)
denoise = cv2.fastNlMeansDenoising(equal, 10, 10, 7, 21)
blurred = cv2.GaussianBlur(denoise, (3, 3), 0)
blurred = cv2.medianBlur(blurred, 9)
(mu, sigma) = cv2.meanStdDev(blurred)
edge = cv2.Canny(blurred, mu - sigma, mu + sigma)
lines = cv2.HoughLines(edge, 1, np.pi/180, 50)
if lines is not None:
print len(lines[0])
for rho,theta in lines[0]:
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b*rho
x1 = int(x0 + 1000*(-b))
y1 = int(y0 + 1000*(a))
x2 = int(x0 - 1000*(-b))
y2 = int(y0 - 1000*(a))
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.imshow("preview", img)
cv2.waitKey(0)
这只是众多不同尝试中的一种。即使我能找到一种对其中一张图像效果稍好一些的方法,但事实证明它对另一张图像效果要差得多。我并不期待完全完美的结果,但我确信它们可能会比我迄今为止所管理的更好!
谁能提出一个策略来帮助我前进?
【问题讨论】:
-
我投票结束这个问题,因为它属于信号处理,dsp.stackexchange.com
-
示例输出 !Sample Image 1 !Sample Image 2
-
我不同意这完全是信号处理(如果它移动我很好,但是......规则就是规则)。这是一个非常酷的简历问题。您的示例输出准确吗?相机相对于激光源的位置是否始终相同? (即,你有激光发射器的图像常数坐标?)
-
还有。检测到的光束长度重要吗?还是只是角度+传播?
-
您好@user1269942 感谢您抽出宝贵时间查看我的问题。相机是静态的 - 我曾希望激光源可以通过偏离图像的线交叉点来计算(但在我担心之前先努力获得线......)我正在寻找的角度非常简单 - 我' m 寻找图像中线条的角度。长度并不重要。正如您在我上面评论中的两个示例输出中看到的那样,它非常准确地检测线条,但遗漏了很多。
标签: python opencv computer-vision edge-detection hough-transform