gpt4 book ai didi

opencv - 使用 OpenCV 跟踪山脊 - 返回 'ridges' 数组

转载 作者:太空宇宙 更新时间:2023-11-03 20:55:24 25 4
gpt4 key购买 nike

我正在寻找一种方法来找到图像中的脊(局部最大值)并将它们作为脊数组返回(其中脊是定义脊的点的向量)。也就是说,一种行为与 findContours 完全相同的方法(它找到轮廓并将它们作为定义轮廓的向量数组返回),除了山脊。

这是否存在,如果不存在,我将如何实现这种效果? (我正在为 OpenCV 使用 Emgu CV 包装器)

我有这张图片(抱歉,有点模糊),它是使用道路系统二值图像的距离变换获得的:

Distance transform of binary image of a road system

我可以轻松地在原始二值图像上使用 findContours 来获取作为点向量的道路轮廓。不过,我对道路中心线感兴趣。道路中心线由上图中的局部最大值表示。

显然,在此图像上使用 findContours 再次给出了道路轮廓。我打算使用非极大值抑制来去除中心线以外的所有内容,并在其上使用 findContours,但我也不知道如何进行非极大值抑制,因此我的问题是 here

最佳答案

你想沿着每条线的梯度方向做最大抑制。

  1. 计算梯度方向。
  2. 对于每个点,沿着局部梯度方向的一条直线搜索最大值。2.1 如果当前点是最大值标记为1,否则标记为0
import cv2
import numpy as np
import math
from matplotlib import pyplot as plt

# Read image
Irgb = cv2.imread('road.png')
I = Irgb[:,:,0]

# Find the gradient direction
sobelx = cv2.Sobel(I,cv2.CV_64F,1,0,ksize=1)
sobely = cv2.Sobel(I,cv2.CV_64F,0,1,ksize=1)

gradDirection = np.zeros(I.shape, np.float64)

for y in range(I.shape[0]):
for x in range(I.shape[1]):
gradDirection[y, x] = np.float64(math.atan2(sobely[y,x], sobelx[y,x]))

# Iterate on all points and do max suppression
points = np.nonzero(I)
points = zip(points[0], points[1])
maxSuppresion = np.zeros_like(I)
for point in points:
y = point[0]
x = point[1]

# Look at local line along the point in the grad direction
direction = gradDirection[y, x]
pointValues = []
for l in range(-1,2):
yLine = int(np.round(y + l * math.sin(direction)))
xLine = int(np.round(x + l * math.cos(direction)))

if(yLine < 0 or yLine >= maxSuppresion.shape[0] or xLine < 0 or xLine >= maxSuppresion.shape[1]):
continue

pointValues.append(I[yLine,xLine])

# Find maximum on line
maxVal = np.max(np.asarray(pointValues))

# Check if the current point is the max val
if I[y,x] == maxVal:
maxSuppresion[y, x] = 1
else:
maxSuppresion[y, x] = 0

# Remove small areas
im2, contours, hierarchy = cv2.findContours(maxSuppresion,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE )
minArea = 5
maxSuppresionFilter = np.zeros_like(maxSuppresion)
finalShapes = []
for contour in contours:
if contour.size > minArea:
finalShapes.append(contour)

cv2.fillPoly(maxSuppresionFilter, finalShapes, 1)
cv2.imshow('road',maxSuppresionFilter*255)

最后会得到如下图: enter image description here

您可以看到仍然存在问题,尤其是在交叉点周​​围,局部最大值抑制抑制了交叉点中心附近的点。您可以尝试使用形态学操作来克服这些问题。

关于opencv - 使用 OpenCV 跟踪山脊 - 返回 'ridges' 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36573001/

25 4 0
文章推荐: php - 如何删除无序列表的起始元素符号
文章推荐: css - 如何将内部 div 切割为其父 div 大小?
文章推荐: html - CSS border-collapse 在 中不起作用
文章推荐: HTML。单行中的列