python 获取图像中垂直线的边缘/线

watbbzwu  于 2023-02-28  发布在  Python
关注(0)|答案(1)|浏览(218)

我有一批相似的图像需要分析。
之后

  • 定阈
  • 使用skimage.morphology.reconstruction填充孔(here使用示例)
  • 图像闭合

我得到了这样的图像:

我对形状的边缘感兴趣,特别是原始灰度图像中垂直线的斜率。我想我可以使用Canny来获得轮廓,这确实给了我:

我的问题:

1.我该如何分离近似垂直和水平的边缘呢?它们对我来说有着非常不同的意义,因为我对相邻水平线之间发生的事情一点也不感兴趣(我宁愿从图像中剪切这些部分),而对垂直线周围发生的事情(黑白图像中的白色周围)感兴趣。
1.我会假设我的线应该是直的(可能有一个斜坡,但噪音太高)。我该如何平滑轮廓线?
1.最后我想回到灰度图像,看看垂直线附近的像素统计。如何从Canny找到的边缘中提取线的位置信息?
我的代码:

im_th= cv2.inRange(img, 0, 500, cv2.THRESH_BINARY)
seed = np.copy(im_th)
seed[1:-1, 1:-1] = im_th.max()
mask = im_th
filled = reconstruction(seed, mask, method='erosion').astype(np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(4,4))
closed = cv2.morphologyEx(filled,cv2.MORPH_CLOSE, kernel=kernel)
edges = cv2.Canny(cv2.medianBlur(closed, 5), 50, 150)
vc9ivgsu

vc9ivgsu1#

你在寻找类似Hough transform的东西吗?你应该可以直接在你检测到的边缘上使用它。
1.水平线不影响结果。(您可以按Angular 筛选线)
1.稍微倾斜的线不会影响结果。

  1. Hough变换告诉你直线的位置和它们的Angular --它根据你的边缘像素在你的图像上拟合一条无限长的直线。因为你知道直线的斜率和从直线到原点的最短距离,你可以检查直线相交的每个像素。
  • 但是,如果您要查找每个垂直线段**开始和结束位置的特定(x,y)坐标,这可能无法回答您的问题。*

我从OpenCV教程中复制了代码样本,并在您的图像上进行了测试,以找到两条垂直线:

>>> import cv2 as cv
>>> import numpy as np
>>> src = cv.imread("test.png")
>>> edge = cv.Canny(src, 50, 200, None, 3)
>>> cv.HoughLines(edge, 1, np.pi / 180, 150, None, 0, 0)
array([[[ 81.,   0.]],

       [[144.,   0.]]], dtype=float32)

相关问题