- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在寻找一种方法来找到图像中的脊(局部最大值)并将它们作为脊数组返回(其中脊是定义脊的点的向量)。也就是说,一种行为与 findContours 完全相同的方法(它找到轮廓并将它们作为定义轮廓的向量数组返回),除了山脊。
这是否存在,如果不存在,我将如何实现这种效果? (我正在为 OpenCV 使用 Emgu CV 包装器)
我有这张图片(抱歉,有点模糊),它是使用道路系统二值图像的距离变换获得的:
我可以轻松地在原始二值图像上使用 findContours 来获取作为点向量的道路轮廓。不过,我对道路中心线感兴趣。道路中心线由上图中的局部最大值表示。
显然,在此图像上使用 findContours 再次给出了道路轮廓。我打算使用非极大值抑制来去除中心线以外的所有内容,并在其上使用 findContours,但我也不知道如何进行非极大值抑制,因此我的问题是 here
最佳答案
你想沿着每条线的梯度方向做最大抑制。
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)
您可以看到仍然存在问题,尤其是在交叉点周围,局部最大值抑制抑制了交叉点中心附近的点。您可以尝试使用形态学操作来克服这些问题。
关于opencv - 使用 OpenCV 跟踪山脊 - 返回 'ridges' 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36573001/
我是一名优秀的程序员,十分优秀!