我在一个无噪音的程序生成的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探测器内置的高斯模糊使得线条更难检测。
据推测,张贴的图片并不代表一般情况,因此我的回答可能不合适。
如果你在垂直线上得到像素,没有什么比检测从白到黑的转换更容易的了,反之亦然。因为线是完全水平的,所以对于单个列来说就足够了(但是如果你愿意,你可以对每个列重复)!
通过上述方法,您可以获得线条的两侧,以及它们的原始间距。如果您需要一条记录道,请对纵坐标求平均值。
一种简单的方法是简单地设置阈值,反转使线为白色,然后骨架化。下面是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就是