当前位置: 首页 > 知识库问答 >
问题:

在Python OpenCV中检测线而不应用高斯模糊

赏高格
2023-03-14

我在一个无噪音的程序生成的png文件中检测线条。我通常会使用Hough线,这要求我首先提供canny检测的边缘,但canny检测的第一步是应用高斯模糊来消除噪声。有没有一种方法可以在我的原始图像上进行边缘检测,而不会故意使其模糊?我怀疑这将产生更好的结果比毛刺第一,因为线已经完全干净和高对比度。

下面是一个使用canny检测和图像的简单示例。每组中的行从5像素宽开始,然后下一行是4,然后是3、2和1。正如您所看到的,canny检测并不完美(2像素线看起来比1像素线小):

原始图像:

边缘(canny检测结果):

示例代码


import cv2
import numpy as np
import matplotlib.pylab as plot

# img = cv2.imread("8px_and_2px_lines.png")
img = cv2.imread("5-1px_lines.png")

crop_size = 520
img = img[100:crop_size, 100:crop_size]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite("5-1px_lines_cropped.png", img)
cv2.imshow("start", img)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
cv2.imshow("canny", edges)
cv2.imwrite("5-1px_lines_cropped_canny.png", edges)
# plot.imshow(edges, cmap="gray")
# plot.show()

lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)
line_length = 3000
for line in lines:
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    x1 = int(x0 + line_length * (-b))
    y1 = int(y0 + line_length * (a))
    x2 = int(x0 - line_length * (-b))
    y2 = int(y0 - line_length * (a))
    cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.imshow("lines", img)
cv2.waitKey()

关于如何对这些图像进行更好的线条检测,有什么想法吗?我认为canny探测器内置的高斯模糊使得线条更难检测。

共有2个答案

孟承嗣
2023-03-14

据推测,张贴的图片并不代表一般情况,因此我的回答可能不合适。

如果你在垂直线上得到像素,没有什么比检测从白到黑的转换更容易的了,反之亦然。因为线是完全水平的,所以对于单个列来说就足够了(但是如果你愿意,你可以对每个列重复)!

通过上述方法,您可以获得线条的两侧,以及它们的原始间距。如果您需要一条记录道,请对纵坐标求平均值。

白刚洁
2023-03-14

一种简单的方法是简单地设置阈值,反转使线为白色,然后骨架化。下面是Python/OpenCV/Skimage的代码

输入:

import cv2
import numpy as np
import skimage.morphology

img = cv2.imread("lines_horizontal.png")
ht, wd = img.shape[:2]

# convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# create a binary thresholded image
thresh = cv2.threshold(gray, 0, 1, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]

# invert so lines are white
thresh = 1 - thresh

# apply skeletonization
skeleton = skimage.morphology.skeletonize(thresh)
skeleton = (255*skeleton).clip(0,255).astype(np.uint8)

# save result
cv2.imwrite("lines_horizontal_skeleton.png", skeleton)

# show results
cv2.imshow("skeleton", skeleton)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

请注意,从endpoint处的骨骼化开始,endpoint处会出现一些扭曲。

还要注意,OpenCV OpenCV contrib python有一种类似于骨架化的细化方法。

 类似资料:
  • 主要内容:示例在高斯模糊操作中,图像与高斯滤波器而不是盒式滤波器卷积。 高斯过滤器是一个低通过滤器,可以消除高频分量的减少。 可以使用类的方法在图像上执行此操作。 以下是这种方法的语法 - 该方法接受以下参数 - src - 表示此操作的源(输入图像)的对象。 dst - 表示此操作的目标(输出图像)的对象。 ksize - 表示内核大小的对象。 sigmaX - 类型变量表示方向上的高斯核标准差。 示例 以下

  • 问题内容: 我正在用Piccolo编写一个交互式applet,并且需要在其中包含高斯曲线(又称正态分布图)。 我想象任何一种Java实现都足够,但是我找不到。理想情况下,我想传递一组值并将图表绘制在面板,图像对象或可以嵌入在applet中的任何对象中。 在让我自己动手编写代码之前,有人知道做这件事的有用代码吗? 欢迎使用其他语言的实现,只要它们易于移植到Java中即可。 问题答案: 不知道它是否有

  • 问题内容: 我想知道是否有某种方法可以使用jQuery(或jQuery可以修改的CSS)在div上应用高斯模糊。我已经研究了blur(),但至少使用Safari,它似乎并没有达到我想要的功能。如果可能的话,我想在效果上使用fadeIn,因此它会逐渐模糊。 谢谢你的帮助! 问题答案: 请注意,这是当DOM元素(例如文本框(输入等))失去焦点时,不应与您所谈论的那种模糊(高斯/运动模糊)混合在一起的时

  • 注意: Internet Explorer和Safari不支持SVG滤镜! <defs> 和 <filter> 所有互联网的SVG滤镜定义在<defs>元素中。<defs>元素定义短并含有特殊元素(如滤镜)定义。 <filter>标签用来定义SVG滤镜。<filter>标签使用必需的id属性来定义向图形应用哪个滤镜? SVG <feGaussianBlur> 实例 1 <feGaussianBlu

  • 本文向大家介绍python绘制高斯曲线,包括了python绘制高斯曲线的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python绘制高斯曲线的具体代码,供大家参考,具体内容如下 源码: 效果图: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 1)概述 正太分布也叫高斯分布,正太分布的概率密度曲线也叫高斯分布概率曲线_。_ GaussianMixtureModel(混合高斯模型,GMM)。 聚类算法大多数通过相似度来判断,而相似度又大多采用欧式距离长短作为衡量依据。而GMM采用了新的判断依据:概率,即通过属于某一类的概率大小来判断最终的归属类别。 GMM的基本思想就是:任意形状的概率分布都可以用多个高斯分布函数去近似,也就是说GMM就是